Ich habe eine PostgreSQL-Datenbanktabelle mit dem Namen "user_links", die derzeit die folgenden doppelten Felder zulässt:
year, user_id, sid, cid
Die eindeutige Einschränkung ist derzeit das erste Feld „id“ genannt, aber ich bin jetzt schauen , um eine Einschränkung hinzuzufügen , dass die zu machen year
, user_id
, sid
und cid
sind alle einzigartig , aber ich kann die Einschränkung nicht anwenden , da doppelte Werte bereits die diese Bedingung verletzen existieren.
Gibt es eine Möglichkeit, alle Duplikate zu finden?
sql
postgresql
duplicates
John
quelle
quelle
Antworten:
Die Grundidee besteht darin, eine verschachtelte Abfrage mit Zählaggregation zu verwenden:
Sie können die where-Klausel in der inneren Abfrage anpassen, um die Suche einzugrenzen.
Es gibt eine andere gute Lösung für das, was in den Kommentaren erwähnt wird (aber nicht jeder liest sie):
Oder kürzer:
quelle
select co1, col2, count(*) from tbl group by col1, col2 HAVING count(*)>1
Unter " Doppelte Zeilen mit PostgreSQL suchen " finden Sie hier eine clevere Lösung:
quelle
SELECT * FROM ( SELECT *, LEAD(row,1) OVER () AS nextrow FROM ( SELECT *, ROW_NUMBER() OVER(w) AS row FROM tbl WINDOW w AS (PARTITION BY col1, col2 ORDER BY col3) ) x ) y WHERE row > 1 OR nextrow > 1;
ROW_NUMBER()
mitCOUNT(*)
, und fügen Sierows between unbounded preceding and unbounded following
nachORDER BY id asc
DELETE ...USING
und einigen geringfügigen AnpassungenSie können in den Feldern, die dupliziert werden sollen, derselben Tabelle beitreten und dann im ID-Feld eine Anti-Verknüpfung durchführen. Wählen Sie das ID-Feld aus dem ersten Tabellenalias (tn1) aus und verwenden Sie dann die Funktion array_agg für das ID-Feld des zweiten Tabellenalias. Damit die Funktion array_agg ordnungsgemäß funktioniert, gruppieren Sie die Ergebnisse nach dem Feld tn1.id. Dadurch wird eine Ergebnismenge erstellt, die die ID eines Datensatzes und ein Array aller IDs enthält, die den Verknüpfungsbedingungen entsprechen.
Offensichtlich haben IDs, die sich für eine ID im Array duplicate_entries befinden, auch eigene Einträge in der Ergebnismenge. Sie müssen diese Ergebnismenge verwenden, um zu entscheiden, welche ID Sie zur Quelle der 'Wahrheit' werden möchten. Der eine Datensatz, der nicht gelöscht werden sollte. Vielleicht könnten Sie so etwas tun:
Wählt die IDs mit der niedrigsten Anzahl aus, die Duplikate aufweisen (vorausgesetzt, die ID erhöht sich in PK). Dies wären die IDs, die Sie behalten würden.
quelle
Zur Vereinfachung gehe ich davon aus, dass Sie eine eindeutige Einschränkung nur für das Spaltenjahr anwenden möchten und der Primärschlüssel eine Spalte mit dem Namen id ist.
Um doppelte Werte zu finden, sollten Sie Folgendes ausführen:
Mit der obigen SQL-Anweisung erhalten Sie eine Tabelle, die alle doppelten Jahre in Ihrer Tabelle enthält. Um alle Duplikate mit Ausnahme des letzten Duplikateintrags zu löschen , sollten Sie die obige SQL-Anweisung verwenden.
quelle