В основном я хочу скопировать таблицу DET в таблицу DET_NEW .Я знаю, что DET имеет несколько дублированных строк, поэтому я хочу сделать это, вставляя дублированные строки только один раз.Как видите, я хочу скопировать эти строки по периодам, используя HDR таблицу.
Изменить, чтобы добавить информацию: DET не имеет первичных ключей (поэтому он имеетдублированные строки). DET_NEW имеет составной первичный ключ с FK1 и FK2 .
ПРОБЛЕМА:
IЗнаю, что это не новая тема.Я перепробовал все найденные решения, и SQL Server возвращает ошибку о нарушении ограничения первичного ключа («невозможно вставить дубликат ключа»).Запросы выполнялись явно только с одним ядром.
Я видел, что MySQL имеет INSERT IGNORE, но я думаю, что в SQL Server нет ничего похожего.
Мои решения следующие:
Запрос 1:
INSERT INTO DET_NEW
(FK1, FK2, value)
SELECT DISTINCT D.FK1, D.FK2, D.value
FROM HDR AS H,
DET AS D
WHERE H.Date >= CONVERT( datetime, '2015-01-01 00:00:00', 20 )
and H.Date < CONVERT( datetime, '2016-01-01 00:00:00', 20 )
and H.FK1 = D.FK1
Запрос 2:
INSERT INTO DET_NEW
(FK1, FK2, value)
SELECT D.FK1, D.FK2, D.value
FROM
( SELECT DISTINCT D.FK1, D.FK2, D.value
FROM HDR AS H,
DET AS D
WHERE H.Date >= CONVERT( datetime, '2015-01-01 00:00:00', 20 )
and H.Date < CONVERT( datetime, '2016-01-01 00:00:00', 20 )
and H.FK1 = D.FK1
)D
Запрос 3:
INSERT INTO DET_NEW
(FK1, FK2, value)
SELECT D.FK1, D.FK2, D.value
FROM HDR AS H,
DET AS D
WHERE H.Date >= CONVERT( datetime, '2018-02-01 00:00:00', 20 )
and H.Date < CONVERT( datetime, '2018-02-05 00:00:00', 20 )
and H.FK1 = D.FK1
GROUP BY D.FK1, D.FK2
Запрос 4:
WITH cte AS (
SELECT D.FK1, D.FK2, D.value,
row_number() OVER(PARTITION BY D.FK1, D.FK2, D.value ORDER BY D.FK1) AS [rn]
FROM HDR AS H,
DET AS D
WHERE H.Date >= CONVERT( datetime, '2018-02-01 00:00:00', 20 )
and H.Date < CONVERT( datetime, '2018-02-03 00:00:00', 20 )
and H.FK1 = D.FK1
)
INSERT INTO DET_NEW
(FK1, FK2, value)
SELECT cte.FK1, cte.FK2, cte.value
FROM cte
WHERE cte.[rn] = 1
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Я выполнил следующий запрос: во внешней части код проверяет наличие дублирования;внутри есть SELECT DISTINCT, такой же, как Query 2. Результаты более 1 тыс. строк, поэтому в запросах есть что-то неверное.
SELECT D.FK1, D.FK2, COUNT(D.FK1) AS count
FROM (
SELECT DISTINCT D.FK1, D.FK2, D.value
FROM HDR AS H,
DET AS D
WHERE H.Date >= CONVERT( datetime, '2018-02-01 00:00:00', 20 )
and H.Date < CONVERT( datetime, '2018-02-03 00:00:00', 20 )
and H.FK1 = D.FK1
)D
GROUP BY D.FK1, D.FK2
HAVING
COUNT(*) > 1
Вопросы: Почему я вставляю дубликаты?Есть еще один эффективный способ для большой базы данных (миллиарды строк)?