Как получить код T-SQL для поиска дубликатов?
У MS Access есть кнопка для генерации SQL-кода для поиска дублированных строк. Я не знаю, имеет ли это SQL Server 2005/2008 Managment Studio.
-
Если у вас есть, укажите, где
-
Если это не так, скажите, пожалуйста, как я могу получить помощник T-SQL для создания такого кода.
Ответы
Ответ 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.
Если ваши строки дублируются, кроме ключа, тогда не включайте ключ в поля выбора.