Референтен - на - SQL (ГСД) как да се премахване на дублиращи се редове от таблицата
Обикновено възниква този въпрос, когато проектирането на грешките на маси, по-специално, не е основен ключ, и вече има доказателства, че възпрепятстват създаването му. В този домейн ограничения изискват уникалност на данни.
Да предположим, че имаме следната таблица T:
За простота, аз не включват тук другите колони, като се предполага, че данните, които са уникално определят от стойността в името на колоната. Вие искате да направите колона уникално име (например, първичен ключ), след премахване на дубликати.
Обща решение на този проблем е да се осигури изискваната структура на спомагателната масата, която се копира уникални редове в таблицата Т, последвано от отстраняване на маса Т, и преименуване спомагателната масата. По-долу е кода в T-SQL. изпълнява алгоритъм.
Резултатът е, което искахме:
В този случай, на първичния ключ ограничение ще предотврати появата на дубликати след това.
Възможно ли е да се направи без да се създава нова таблица? Възможна. Например, като се използва следния алгоритъм:
- добавяне на брояч нов тип колона (идентичност), който преномериране всички редове в таблицата;
- от всяка група от редове с еднаква стойност в името на колоната, за да изтриете всички редове с изключение на редове с максималния брой (или минимум - това така или иначе, тъй като ние се занимаваме с дубликати);
- премахване на спомагателната колона;
- налагане на ограничение.
Ето един пример за такъв подход:
И ако без да се създава допълнителна колона? Отново отговорът е да, но след това се нуждаем от нови езикови особености, посочени в ANSI SQL-99 стандарта. Идеята е да не се създаде постоянна колона в таблицата, която след това трябва да бъдат премахнати, и виртуалното (изчислен). В тази графа, ние ще създадем с помощта на прозореца функции. повишен в ранг на всеки ред в рамките на прозореца определя от равенството на ценности в името на колоната. И накрая, ние ще изтрие всички редове с ранг по-висок от 1.
Нека да разгледаме по-подробно изграждането на искане за премахване на дублиращи се по този метод.
1. Линия номерация
Не можем просто да се класира на линията, просто защото те не са от това, което ранг. Фактът, че една и съща линия ще има същия ранг. Ето защо, ние първо трябва да ги изброявам, подредени по име на колона.
резултатът
2. Класиране на дублиращи се редове в рамките на групи
За съжаление, това е забранено (MS SQL Server), за да използвате функцията на прозорец в рамките на функциите на прозорците. Т.е. ние не можем да напишете:
и следователно се използват под-заявка:
Тук е резултат от това искане.
3. Премахване на дубликат на виртуалната маса
Неприемливи изтривате записи от заявката, т.е. не можем да използваме тази възможност:
защото в Изтриване на извлечението е разрешено да използва база за маса или вижте само. Ето защо, ние може да създаде оглед и изтриване на записи от него вече. Разбира се, в случая записи се изтриват от базовата таблица, на която да се създаде гледка. Така че можем да се процедира, както следва:
"Отново, за да създадете нещо" - може да се каже. Не е задължително, както и за да го докаже, ние ще Ви помогнем обща маса израз (КТР), което може да се нарече една виртуална представителство. КТР, въпреки че те не се съхраняват в обектите на данни, може да се използва за актуализиране на операторите. В резултат на това, че всичко се свежда до едно искане:
Не забравяйте да създадете основен ключ. -)
Имам външен линк към тази статия и решава да се, за да протестират. -)
Това е фразата: "Не можем просто да се класира на линията, просто защото те не са от това, което ранг."
Разбира се, това е вярно, но ние можем да се откажем класацията (за сметка на ученето :-)) чрез извършване на "psevdoranzhirovanie". Фактът, че е възможно да се извърши независима номерация за всяка група, ако предложението за НАД ROW_NUMBER функционира да използвате завесата конструкция. Така че, можем да направим без функцията за ранг, ако извършите дял от име
Това ще улесни последващо искане, по-специално, на последното решение на проблема премахване на дубликати могат да бъдат пренаписани като: