Подтвердить что ты не робот

Как получить код T-SQL для поиска дубликатов?

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

  • Если у вас есть, укажите, где

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

4b9b3361

Ответ 1

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

Однако, как построить 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, считаются дублирующими. Разверните список столбцов, чтобы содержать все столбцы, для которых вы хотите проанализировать это.

Ответ 2

Если вы используете 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

Ответ 3

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

SELECT * FROM db WHERE col IN
    (SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1)
    ORDER BY col

Ответ 4

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

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