2009-08-03 18 views

Odpowiedz

107

Cóż, jeśli masz całe wiersze jako powtarzające się na stole, masz przynajmniej nie ma klucza podstawowego powołania do tej tabeli, w przeciwnym razie przynajmniej wartość klucza podstawowego byłaby inna.

Jednakże, oto jak zbudować SQL, aby uzyskać duplikaty nad zestawem kolumn:

SELECT col1, col2, col3, col4 
FROM table 
GROUP BY col1, col2, col3, col4 
HAVING COUNT(*) > 1 

ten znajdzie wiersze, które dla kolumny Col1-Col4, ma taką samą kombinację wartości, więcej niż raz .

Na przykład, w poniższej tabeli, wiersze 2 + 3 będzie duplikatach

PK col1 col2 col3 col4 col5 
1  1  2  3  4  6 
2  1  3  4  7  7 
3  1  3  4  7  10 
4  2  3  1  4  5 

Dwa rzędy mają wspólne wartości kolumny COL1-Col4, a więc przez to SQL jest uważany duplikatów. Rozwiń listę kolumn, aby zawierały wszystkie kolumny, dla których chcesz to przeanalizować.

+0

was ma rację, ponieważ kod nie jest tak trudne, jak się spodziewałem . W innych językach SQL ręczne kodowanie może być trudne –

+3

Nie powinno być, to jest standardowy SQL, nic specyficznego dla T-SQL. Powinien być taki sam dla MySQL, SQLite, Oracle, Sybase, DB2 itd. –

+0

Masz rację. Brak podświetlania składni i głośny kod sprawił, że wierzyłem, że kod generowany przez MS Access był trudny do zrozumienia, a ja nawet nie próbowałem wcześniej. –

2

AFAIK, nie ma. Po prostu utwórz grupowanie instrukcji wyboru według wszystkich pól tabeli i filtrowanie przy użyciu klauzuli mającej, w której liczba jest większa niż 1.

Jeśli twoje wiersze są duplikowane z wyjątkiem klucza, nie dodawaj klucza wybrane pola.

51

Jeśli używasz SQL Server 2005+, można użyć następującego kodu, aby zobaczyć wszystkie wiersze wraz z innymi kolumnami:

SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
FROM table 

Youd można również usunąć (lub inaczej pracować) powiela za pomocą tego technika:

WITH cte AS 
(SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
    FROM table 
) 
DELETE FROM cte WHERE DuplicateRowNumber > 1 

ROW_NUMBER jest niezwykle mocny - nie ma wiele można z nim zrobić - patrz artykuł Bol na niego w http://msdn.microsoft.com/en-us/library/ms186734.aspx

+3

+1 za pouczenie nas, jak usunąć. Poza tym twój fragment zawiera również PK. /necro – theTuxRacer

+0

to powinno być głosowane na top1 – SQueek

+0

Kolejną korzyścią jest to, że wydaje się, że działa szybciej niż grupa według podejrzeń, które widziałem. –

5

znalazłem ten zol ution kiedy muszę zrzucić całe wiersze z jednego lub większej liczby duplikatów pól, ale nie chcę, aby wpisać każdą nazwę pola w tabeli:

SELECT * FROM db WHERE col IN 
    (SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1) 
    ORDER BY col 
Powiązane problemy