2010-01-28 14 views
5

Jeden na pytanie w wywiadzie byłpojedynczego zapytania usunąć i wyświetlić zduplikowane rekordy

Jeden stół ma 100 rekordów. 50 z nich jest duplikatami. Czy to możliwe za pomocą pojedynczej kwerendy , aby usunąć duplikaty rekordów z tabeli, a także wybrać i wyświetlić pozostałe 50 rekordów.

Czy jest to możliwe w pojedynczym zapytaniu SQL?

Dzięki

SNA

+0

Dlaczego chcesz/trzeba to zrobić? –

+1

Prawdopodobnie zależy to od silnika bazy danych, ale z SQL Server jest to zdecydowanie możliwe. –

+2

Oracle, serwer Microsoft SQL, mysql lub inny? proszę podać – kurast

Odpowiedz

6

z SQL Server należy użyć coś jak ten

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 

rachunku OUTPUT pokazuje rekordy zostaną usunięte.

Aktualizacja:

Przede zapytania usunie duplikaty i daje wiersze, które zostały usunięte, a nie wiersze, które pozostają. Jeśli to jest dla ciebie ważne (w sumie pozostałe 50 wierszy powinno być identyczne z 50 usuniętymi wierszami), możesz użyć składni SQL Server's 2008 MERGE, aby to osiągnąć.

+1

Podobał mi się fakt, że wyraźnie pokazałeś, jak to zrobić, podczas gdy ludzie z 4 i 10 razy twoją przedstawicielką mówią, że nie jest to możliwe. – cjk

+0

Po prostu pokazuje, że nikt nie jest * (onmiscient) (omsincient) (omnicsient) * ... wie wszystko. –

+0

+1 Wow, już nauczyłem się czegoś nowego dzisiaj i jest jeszcze ranek. :) –

0

Brzmi mało prawdopodobne, przynajmniej w ANSI SQL, ponieważ usuwać tylko zwraca liczbę liczby usuniętych wierszy.

1

Lieven's Answer to dobre wyjaśnienie sposobu wyprowadzania usuniętych wierszy. Chciałbym dodać dwie rzeczy:

  1. Jeśli chcesz zrobić coś więcej z wyjściem innym niż wyświetlanie go można określić OUTPUT INTO @Tbl (gdzie @Tbl jest stół-var zadeklarować przed skreślony);

  2. Korzystanie z MAX, MIN lub dowolnego innego agregatu może obsłużyć tylko jeden duplikat na grupę. Jeśli jest to możliwe, aby mieć wiele duplikatów, następujący kod SQL Server 2005+ pomoże zrobić:

 

;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 
) 
Powiązane problemy