2010-01-28 10 views
5

Einer der Frage in einem Interview gefragt angezeigt war,einzige Abfrage zu löschen und doppelten Datensätze

Eine Tabelle hat 100 Datensätze. 50 von ihnen sind Duplikate. Ist es möglich, mit einer einzigen Abfrage die doppelten Datensätze aus der Tabelle zu löschen sowie die restlichen 50 Datensätze anzuzeigen und anzuzeigen.

Ist dies in einer einzigen SQL-Abfrage möglich?

Dank

SNA

+0

Warum würden Sie wollen/müssen, dies zu tun? –

+1

Es hängt wahrscheinlich von der Datenbank-Engine ab, aber mit SQL Server ist es definitiv möglich. –

+2

Oracle, Microsoft SQL Server, MySQL oder andere? Bitte geben Sie – kurast

Antwort

6

mit SQL Server würden Sie so etwas wie dieses

DECLARE @Table TABLE (ID INTEGER, PossibleDuplicate INTEGER) 

INSERT INTO @Table VALUES (1, 100) 
INSERT INTO @Table VALUES (2, 100) 
INSERT INTO @Table VALUES (3, 200) 
INSERT INTO @Table VALUES (4, 200) 

DELETE FROM @Table 
OUTPUT Deleted.* 
FROM @Table t 
     INNER JOIN (
     SELECT ID = MAX(ID) 
     FROM  @Table 
     GROUP BY PossibleDuplicate 
     HAVING COUNT(*) > 1 
    ) d ON d.ID = t.ID 

Die OUTPUT Anweisung zeigt die Datensätze verwenden, die gelöscht.

Update:

Above Abfrage Duplikate löschen und geben Sie die Zeilen, die gelöscht werden, nicht die Zeilen, die bleiben. Wenn das für Sie wichtig ist (die restlichen 50 Zeilen sollten identisch mit den 50 gelöschten Zeilen sein), könnten Sie die Syntax SQL Server's 2008 MERGE verwenden, um dies zu erreichen.

+1

Ich mag die Tatsache, dass Sie deutlich gezeigt haben, wie es geht, während Menschen mit 4 und 10 Mal Ihre Vertreter sagen, dass es nicht möglich ist. – cjk

+0

Zeigt nur, dass niemand ist * (onmiscient) (omsincient) (omnicsient) * ... weiß alles. –

+0

+1 Wow, ich habe heute schon etwas Neues gelernt und es ist immer noch Morgen. :) –

0

Klingt unwahrscheinlich, zumindest in ANSI SQL, da nur ein Löschen der Zählung der Anzahl der gelöschten Zeilen zurückgibt.

1

Lieven's Answer ist eine gute Erklärung, wie die gelöschten Zeilen ausgegeben werden. Ich möchte zwei Dinge hinzufügen:

  1. Wenn Sie etwas mehr mit dem Ausgang anders als die Anzeige, es tun möchten, können Sie OUTPUT INTO @Tbl angeben (wo @Tbl ist eine tabellen var Sie vor dem gelöschten erklären);

  2. Mit MAX, MIN oder einem der anderen Aggregate kann nur eine doppelte Zeile pro Gruppe behandelt werden. Wenn es möglich ist für Sie viele Duplikate haben, wird dazu beitragen, die folgenden SQL Server 2005+ Code tun:

 

;WITH Duplicates AS 
(
    SELECT 
     ID, 
     ROW_NUMBER() OVER (PARTITION BY DupeColumn ORDER BY ID) AS RowNum 
) 
DELETE FROM MyTable 
OUTPUT deleted.* 
WHERE ID IN 
(
    SELECT ID 
    FROM Duplicates 
    WHERE RowNum > 1 
) 
Verwandte Themen