Открытая коллекция знаний

OpenU.Ru

Язык запросов SQL

SQL-запрос на вывод повторяющихся строк таблицы

Как выбрать повторяющиеся строки из таблицы?

При работе с базами данных довольно часто возникает ситуация, когда нужно вывести повторяющиеся строки в таблице или повторяющиеся значения некоторых из полей строк.

Предположим, есть таблица TableName, содержащая некое поле DuplicateField. Нужно выбрать все строки, содержащие дублирующиеся значения поля DuplicateField и их количество. Т.е. выбрать те строки, в которых в поле записано одно и тоже значение более одного раза. Тогда запрос на выбор дублирующихся строк для поля DuplicateField может выглядеть так:

SELECT DuplicateField, count(DuplicateField)
FROM TableName
GROUP BY DuplicateField
HAVING count(DuplicateField)>1;

Чтобы выбрать конкретные дублирующиеся элементы, содержащие только значение @SomeValue (параметр), можно добавить условие «WHERE»:

SELECT DuplicateField, count(DuplicateField)
FROM TableName
WHERE DuplicateField=@SomeValue
GROUP BY DuplicateField
HAVING count(DuplicateField)>1;

Если нужно провести выборку по нескольким повторяющимся полям, то sql-запрос может выглядеть так:

SELECT DuplicateField1, DuplicateField2
FROM TableName
GROUP BY DuplicateField1, DuplicateField2
HAVING (count(DuplicateField2)>1 AND count(DuplicateField2)>1);

И, наконец, если нужно вывести полные строки, содержащие все поля (выбрать *), в которых дублируется одно поле, сделать это можно таким sql-запросом:

SELECT * FROM TableNeme WHERE DuplicateField IN (
  SELECT DuplicateField, count(DuplicateField)
  FROM TableName
  GROUP BY DuplicateField
  HAVING count(DuplicateField)>1
);

Если нужно выбрать все поля и строки таблицы, в которых в разных строках повторяются комбинации значений двух и более полей, то sql-запрос будет немного сложнее. Для sql-сервера (Transact-SQL), с применением логического оператора Exists, запрос sql может быть таким :

SELECT * FROM TableName t1
WHERE EXISTS (
  SELECT DuplicateField1, DuplicateField2
  FROM TableName t2
  WHERE t1.DuplicateField1=t2.DuplicateField1 AND t1.DuplicateField1 = t2.DuplicateField2
  GROUP BY DuplicateField1, DuplicateField2
  HAVING (count(DuplicateField2)>1 AND count(DuplicateField2)>1)
)