Bevor ich Ihnen etwas raten kann, muss ich die Antwort auf diese Frage wissen:
name phone email
John 555-00-00 john@example.com
John 555-00-01 john@example.com
John 555-00-01 john-other@example.com
Was COUNT(*)
was Sie für diese Daten wollen?
更新しました。
Wenn Sie nur wissen wollen, dass ein Datensatz jede Duplikate, verwenden Sie dies:
WITH q AS (
SELECT 1 AS id, 'John' AS name, '555-00-00' AS phone, 'john@example.com' AS email
UNION ALL
SELECT 2 AS id, 'John', '555-00-01', 'john@example.com'
UNION ALL
SELECT 3 AS id, 'John', '555-00-01', 'john-other@example.com'
UNION ALL
SELECT 4 AS id, 'James', '555-00-00', 'james@example.com'
UNION ALL
SELECT 5 AS id, 'James', '555-00-01', 'james-other@example.com'
)
SELECT *
FROM q qo
WHERE EXISTS
(
SELECT NULL
FROM q qi
WHERE qi.id <> qo.id
AND qi.name = qo.name
AND (qi.phone = qo.phone OR qi.email = qo.email)
)
Das ist effizienter, sagt aber nichts darüber aus, wo die doppelte Kette begonnen hat.
Diese Abfrage wählt alle Einträge zusammen mit dem speziellen Feld aus, chainid
die angibt, wo die doppelte Kette begonnen hat.
WITH q AS (
SELECT 1 AS id, 'John' AS name, '555-00-00' AS phone, 'john@example.com' AS email
UNION ALL
SELECT 2 AS id, 'John', '555-00-01', 'john@example.com'
UNION ALL
SELECT 3 AS id, 'John', '555-00-01', 'john-other@example.com'
UNION ALL
SELECT 4 AS id, 'James', '555-00-00', 'james@example.com'
UNION ALL
SELECT 5 AS id, 'James', '555-00-01', 'james-other@example.com'
),
dup AS (
SELECT id AS chainid, id, name, phone, email, 1 as d
FROM q
UNION ALL
SELECT chainid, qo.id, qo.name, qo.phone, qo.email, d + 1
FROM dup
JOIN q qo
ON qo.name = dup.name
AND (qo.phone = dup.phone OR qo.email = dup.email)
AND qo.id > dup.id
),
chains AS
(
SELECT *
FROM dup do
WHERE chainid NOT IN
(
SELECT id
FROM dup di
WHERE di.chainid < do.chainid
)
)
SELECT *
FROM chains
ORDER BY
chainid
0 Stimmen
Sie wollen also, dass 'Bob / 567 / irgendwas', 'Bob / irgendwas / bob@bob.com' und 'Bob / 567 / bob@bob.com' als Duplikate gezählt werden? Was ist, wenn es einen "Bob / 234 / bob@bob.com" gibt? Einige Datenbeispiele zur Verdeutlichung Ihrer Gruppierungsregel wären sehr hilfreich.
0 Stimmen
Nachvollziehbar. Das tut mir leid. Quassnoi hat unten ein gutes Beispiel gegeben (und ich habe die Frage dort beantwortet). Ich danke Ihnen.
0 Stimmen
Möchten Sie tatsächlich Duplikate entfernen?