Jak mogę usunąć zduplikowane wiersze, których nie unique row id
ma?
Mój stolik jest
col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
sally 2 2 2 2 2 2
Chcę, aby po usunięciu duplikatu pozostały następujące informacje:
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
Próbowałem kilka zapytań, ale myślę, że zależą one od identyfikatora wiersza, ponieważ nie otrzymuję pożądanego rezultatu. Na przykład:
DELETE
FROM table
WHERE col1 IN (
SELECT id
FROM table
GROUP BY id
HAVING (COUNT(col1) > 1)
)
mysql
sql
sql-server-2008
duplicates
sql-delete
Fearghal
źródło
źródło
Odpowiedzi:
I jak współczynniki CTE i
ROW_NUMBER
jako dwa połączone pozwalają nam zobaczyć, które wiersze są usuwane (lub aktualizowany), więc po prostu zmienićDELETE FROM CTE...
naSELECT * FROM CTE
:DEMO (wynik jest inny; zakładam, że jest to spowodowane literówką z twojej strony)
Ten przykład określa duplikaty według pojedynczej kolumny z
col1
powoduPARTITION BY col1
. Jeśli chcesz dołączyć wiele kolumn, po prostu dodaj je doPARTITION BY
:źródło
AND COl1='John'
). Zwykle należy zastosować filtr w CTE....FROM dbo.Table1 WHERE Col1='John'
. Oto skrzypce: sqlfiddle.com/#!6/fae73/744/0set rowcount 1 delete from t1 where col1=1 and col2=1
tak jak tutajWolę CTE do usuwania duplikatów wierszy z tabeli serwera SQL
zdecydowanie zalecamy śledzenie tego artykułu :: http://codaffection.com/sql-server-article/delete-duplicate-rows-in-sql-server/
źródło
Bez użycia
CTE
iROW_NUMBER()
możesz po prostu usunąć rekordy tylko za pomocą grupowania wedługMAX
funkcji tutaj jest i przykładźródło
MIN(ID)
źródło
Zobacz także poniższy sposób usuwania.
Utworzono przykładową tabelę o nazwie
@table
i załadowano ją z podanymi danymi.Uwaga: Jeśli podajesz wszystkie kolumny w
Partition by
części,order by
nie mają większego znaczenia.Wiem, że pytanie zostało zadane trzy lata temu, a moja odpowiedź to kolejna wersja tego, co napisał Tim, ale publikowanie tylko dlatego, że jest pomocne dla każdego.
źródło
Jeśli nie masz żadnych odniesień, takich jak klucze obce, możesz to zrobić. Często to robię, testując dowody koncepcji, a dane testowe są duplikowane.
Przejdź do eksploratora obiektów i usuń starą tabelę.
Zmień nazwę nowego stołu na nazwę starego.
źródło
Microsoft ma bardzo dobry przewodnik na temat usuwania duplikatów. Sprawdź http://support.microsoft.com/kb/139444
W skrócie, oto najprostszy sposób na usunięcie duplikatów, gdy masz tylko kilka wierszy do usunięcia:
myprimarykey to identyfikator wiersza.
Ustawiłem wartość rowcount na 1, ponieważ miałem tylko dwa wiersze, które zostały zduplikowane. Gdybym miał zduplikowane 3 wiersze, ustawiłbym wartość rowcount na 2, aby usunąć pierwsze dwa, które widzi, i zostawić tylko jeden w tabeli t1.
Mam nadzieję, że to pomoże każdemu
źródło
Spróbuj użyć:
źródło
Po wypróbowaniu powyższego sugerowanego rozwiązania działa to w przypadku małych średnich tabel. Mogę zasugerować to rozwiązanie dla bardzo dużych stołów. ponieważ działa w iteracjach.
LargeSourceTable
sp_rename 'LargeSourceTable', 'LargeSourceTable_Temp'; GO
LargeSourceTable
ponownie, ale teraz dodaj klucz podstawowy ze wszystkimi kolumnami, które definiują dodawanie duplikatówWITH (IGNORE_DUP_KEY = ON)
Na przykład:
CREATE TABLE [dbo].[LargeSourceTable] ( ID int IDENTITY(1,1), [CreateDate] DATETIME CONSTRAINT [DF_LargeSourceTable_CreateDate] DEFAULT (getdate()) NOT NULL, [Column1] CHAR (36) NOT NULL, [Column2] NVARCHAR (100) NOT NULL, [Column3] CHAR (36) NOT NULL, PRIMARY KEY (Column1, Column2) WITH (IGNORE_DUP_KEY = ON) ); GO
Utwórz ponownie widoki upuszczone w pierwszej kolejności dla nowo utworzonej tabeli
Teraz uruchom następujący skrypt sql, zobaczysz wyniki w 1 000 000 wierszy na stronę, możesz zmienić numer wiersza na stronę, aby zobaczyć wyniki częściej.
Pamiętaj, że włączam
IDENTITY_INSERT
i wyłączam, ponieważ jedna kolumna zawiera identyfikator automatycznego przyrostu, który również kopiujęSET IDENTITY_INSERT LargeSourceTable ON DECLARE @PageNumber AS INT, @RowspPage AS INT DECLARE @TotalRows AS INT declare @dt varchar(19) SET @PageNumber = 0 SET @RowspPage = 1000000
select @TotalRows = count (*) from LargeSourceTable_TEMP
SET IDENTITY_INSERT LargeSourceTable OFF
źródło
Istnieją dwa rozwiązania w
mysql
:A) Usuń zduplikowane wiersze za pomocą
DELETE JOIN
instrukcjiTo zapytanie dwukrotnie odwołuje się do tabeli kontaktów, dlatego używa aliasu tabeli
t1
it2
.Dane wyjściowe to:
Jeśli chcesz usunąć zduplikowane wiersze i zachować
lowest id
, możesz użyć następującej instrukcji:B) Usuń duplikaty wierszy za pomocą tabeli pośredniej
Poniżej przedstawiono kroki usuwania zduplikowanych wierszy za pomocą tabeli pośredniej:
1. Utwórz nową tabelę o strukturze takiej samej jak oryginalna tabela, którą chcesz usunąć zduplikowane wiersze.
2. Wstaw różne wiersze z oryginalnej tabeli do bezpośredniej tabeli.
3. Wstaw różne wiersze z oryginalnej tabeli do bezpośredniej tabeli.
Krok 1. Utwórz nową tabelę, której struktura jest taka sama jak oryginalnej tabeli:
Krok 2. Wstaw różne wiersze z oryginalnej tabeli do nowej tabeli:
Krok 3. upuść oryginalny stół i zmień nazwę bezpośredniego stołu na oryginalny
Źródło: http://www.mysqltutorial.org/mysql-delete-duplicate-rows/
źródło
źródło
Musisz pogrupować według duplikatów rekordów zgodnie z polami, a następnie zatrzymać jeden z rekordów i usunąć resztę. Na przykład:
źródło
Usuwanie duplikatów z ogromnej (kilka milionów rekordów) tabeli może zająć dużo czasu. Sugeruję, aby zamiast usuwać wstawiać zbiorczo do tabeli tymczasowej wybranych wierszy.
źródło
Można to zrobić na wiele sposobów na serwerze SQL. Najprostszym sposobem jest: Wstawienie odrębnych wierszy ze zduplikowanej tabeli wierszy do nowej tabeli tymczasowej. Następnie usuń wszystkie dane z tabeli duplikatów wierszy, a następnie wstaw wszystkie dane z tabeli tymczasowej, która nie ma duplikatów, jak pokazano poniżej.
Usuń zduplikowane wiersze za pomocą Common Table Expression (CTE)
źródło
źródło
W odniesieniu do https://support.microsoft.com/en-us/help/139444/how-to-remove-duplicate-rows-from-a-table-in-sql-server
Pomysł usunięcia duplikatu obejmuje
Krok po kroku
źródło
Jeśli masz możliwość tymczasowego dodania kolumny do tabeli, było to dla mnie rozwiązanie:
Następnie wykonaj operację USUŃ używając kombinacji MIN i GROUP BY
Sprawdź, czy operacja DELETE została wykonana poprawnie:
Wynik nie powinien mieć wierszy o liczbie większej niż 1. Na koniec usuń kolumnę rowid:
źródło
Inny sposób usuwania zdublowanych wierszy bez utraty informacji w jednym kroku jest następujący:
źródło
Och wow, czuję się tak głupio, przygotowując wszystkie te odpowiedzi, są jak odpowiedź ekspertów ze wszystkimi CTE i tabelą temp. Itp.
I wszystko, co zrobiłem, aby to zadziałało, to po prostu agregacja kolumny identyfikatora za pomocą MAX.
UWAGA: może być konieczne wielokrotne uruchomienie go, aby usunąć duplikat, ponieważ spowoduje to usunięcie tylko jednego zestawu duplikatów na raz.
źródło
źródło
źródło