Ich mag CTEs und ROW_NUMBER
Da die beiden zusammen es uns ermöglichen zu sehen, welche Zeilen gelöscht (oder aktualisiert) werden, ändern Sie einfach den DELETE FROM CTE...
zu 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 (Ergebnis ist anders; ich nehme an, dass es an einem Tippfehler Ihrerseits liegt)
COL1 COL2 COL3 COL4 COL5 COL6 COL7
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
Dieses Beispiel bestimmt Duplikate anhand einer einzelnen Spalte col1
wegen der PARTITION BY col1
. Wenn Sie mehrere Spalten einschließen möchten, fügen Sie sie einfach zu PARTITION BY
hinzu :
ROW_NUMBER()OVER(PARTITION BY Col1, Col2, ... ORDER BY OrderColumn)