Как заставляют код T-SQL находить дубликаты?

T-SQL не является асинхронным, таким образом, у Вас действительно нет выбора, кроме как ожидать, пока SP2 не заканчивается. К счастью это - то, что Вы хотите.

CREATE PROCEDURE SP1 AS
   EXEC SP2
   PRINT 'Done'
54
задан sth 3 August 2009 в 03:18
поделиться

3 ответа

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

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

124
ответ дан 7 November 2019 в 07:36
поделиться

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

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

2
ответ дан 7 November 2019 в 07:36
поделиться

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

62
ответ дан 7 November 2019 в 07:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: