SQL SERVER: как удалить повторяющиеся строки в одной таблице, сопоставляя один-ко-многим другим - PullRequest
0 голосов
/ 17 января 2019

У меня есть SQL Server, содержащий повторяющиеся строки с конкретным столбцом таблицы tableObj, который я хочу удалить. Я использую запрос:

DELETE tableObj 
WHERE id NOT IN 
(SELECT MIN(id)
FROM tableObj
GROUP BY column_name);  

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

The DELETE statement conflicted with the REFERENCE constraint "some_value". The conflict occurred in database "UH", table "Test.otherTable", column 'column_name'.

Это otherTable, с которым существует однозначное отображение tableObj. Теперь, как мне удалить эти ссылки вместе с удалением дубликатов.

Вот как я нахожу дубликаты:

SELECT column_name, COUNT(*)
FROM tableObj
GROUP BY column_name
HAVING 
COUNT(*) > 1

, который дает мне результат как:

column_name   (no-specific column) 
12345              2
23414              3
...........
...........

Отображение сохраняется в таблице отображения, как:

tableObjID         otherTableId

Желаемый результат после выполнения запроса DELETE - получить (COUNT = 1):

column_name   (no-specific column) 
12345              1
23414              1
...........
...........

1 Ответ

0 голосов
/ 17 января 2019

Вам не нужно удалять из otherTable, если настройка ON DELETE CASCADE включена в Foreign Key constraint

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

В вашем случае должен работать следующий запрос.

--Delete the Referenced Data
DELETE FROM otherTable
WHERE ID IN
(
  SELECT ID FROM
   ( 
    SELECT ID, ROW_NUMBER() OVER( PARTITION BY column_name ORDER BY ID) RN
    FROM tableObj
   )T WHERE T.RN>1
)
GO
--DELETING THE DUPLICATE ROWS
WITH CTE AS
(
 SELECT ID, ROW_NUMBER() OVER( PARTITION BY column_name ORDER BY ID) RN
 FROM tableObj
)
DELETE  CTE WHERE RN > 1
...