Как получить код T-SQL для поиска дубликатов? - PullRequest
52 голосов
/ 03 августа 2009

MS Access имеет кнопку для генерации SQL-кода для поиска дублированных строк. Я не знаю, имеет ли это SQL Server 2005/2008 Managment Studio.

  1. Если есть, укажите, где

  2. Если это не так, скажите, пожалуйста, как я могу использовать помощника T-SQL для создания такого кода.

Ответы [ 5 ]

119 голосов
/ 03 августа 2009

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

Однако вот как построить SQL для получения дубликатов в наборе столбцов:

SELECT col1, col2, col3, col4
FROM table
GROUP BY col1, col2, col3, col4
HAVING COUNT(*) > 1

Это найдет строки, которые для столбцов col1-col4 имеют одну и ту же комбинацию значений более одного раза.

Например, в следующей таблице строки 2 + 3 будут дубликатами:

PK    col1    col2    col3    col4    col5
1       1       2       3       4      6
2       1       3       4       7      7
3       1       3       4       7      10
4       2       3       1       4      5

Две строки имеют общие значения в столбцах col1-col4, и, таким образом, этим SQL считается дубликатами. Разверните список столбцов, чтобы он содержал все столбцы, для которых вы хотите проанализировать это.

60 голосов
/ 05 августа 2009

Если вы используете SQL Server 2005+, вы можете использовать следующий код, чтобы увидеть все строки вместе с другими столбцами:

SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber
FROM table

Вы также можете удалять (или иным образом работать с) дубликаты, используя эту технику:

WITH cte AS
(SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber
    FROM table
)
DELETE FROM cte WHERE DuplicateRowNumber > 1

ROW_NUMBER чрезвычайно мощен - с ним можно многое сделать - см. Статью BOL по этому адресу http://msdn.microsoft.com/en-us/library/ms186734.aspx

5 голосов
/ 17 апреля 2014

Я нашел это решение, когда мне нужно вывести целые строки с одним или несколькими повторяющимися полями, но я не хочу вводить каждое имя поля в таблице:

SELECT * FROM db WHERE col IN
    (SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1)
    ORDER BY col
2 голосов
/ 03 августа 2009

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

Если ваши строки дублируются, кроме как по ключу, не включайте ключ в поля выбора.

0 голосов
/ 12 февраля 2019

Еще один способ сделать это - присоединиться к самой таблице.

SELECT *
FROM dbo.TableA aBase
JOIN dbo.TableA aDupes ON aDupes.ColA = aBase.ColA AND
                          aDupes.ColB = aBase.ColB
WHERE aBase.Pkey < aDupes.Pkey

Примечание: aBase.Pkey

Другими словами: Если таблица aBase имеет строку, равную строке из aDupes (на основе ColA и ColB), отражение этого совпадения также будет верным - что aDupes имеет строку, равную строке aBase на основе ColA и ColB. Поэтому оба этих совпадения будут возвращены в наборе результатов.

Сократите это / исключите это отражение, выбрав произвольно все результаты, где одна из таблиц имеет нижний ключ.

<или> не имеет значения, если ключи разные.

Это также обеспечивает фильтрацию совпадений со строкой на себе, поскольку aBase.Pkey заставляет первичные ключи различаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...