Ik hou van CTE's en ROW_NUMBER
aangezien de twee gecombineerd ons in staat stellen om te zien welke rijen zijn verwijderd (of bijgewerkt), verander daarom gewoon de DELETE FROM CTE...
naar SELECT * FROM CTE
:
WITH CTE AS(
SELECT [col1], [col2], [col3], [col4], [col5], [col6], [col7],
RN = ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col1)
FROM dbo.Table1
)
DELETE FROM CTE WHERE RN > 1
DEMO (resultaat is anders; ik neem aan dat het te wijten is aan een typefout van jouw kant)
COL1 COL2 COL3 COL4 COL5 COL6 COL7
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
Dit voorbeeld bepaalt duplicaten met een enkele kolom col1
vanwege de PARTITION BY col1
. Als u meerdere kolommen wilt opnemen, voegt u ze gewoon toe aan de PARTITION BY
:
ROW_NUMBER()OVER(PARTITION BY Col1, Col2, ... ORDER BY OrderColumn)