2013-03-13 5 views
6

Das ist der Tisch mit arbeite ich:Wie schreibe ich eine SQL-Abfrage, um doppelte Werte in einem bestimmten Feld zu identifizieren?

The table

ich nur die ReviewIDs identifizieren mag, die für verschiedene Parameter doppelten Abzug IDs haben.

Zum Beispiel im Bild oben, ReviewID 114 hat zwei verschiedene Parameter-IDs, aber beide Datensätze haben den gleichen Abzug ID.

Für meine Zwecke hat dieser Datensatz (ReviewID 114) einen Fehler. Es sollte nicht zwei oder mehr eindeutige Parameter-IDs geben, die für eine einzelne ReviewID dieselbe Abzug-ID haben.

Ich möchte eine Abfrage schreiben, um diese Arten von Datensätzen zu identifizieren, aber meine SQL-Kenntnisse sind noch nicht da. Hilfe?

Danke!

Update 1: Ich verwende TSQL (SQL Server 2008), wenn das hilft
Update 2: Die Ausgabe, die ich suche wäre das gleiche wie das Bild oben, abzüglich aller Datensätze, die Entsprechen nicht den Kriterien, die ich beschrieben habe.

Prost!

+1

Also, in diesem Bild sollten die beiden 114 Datensätze vorliegen, sowie 5 Fälle von review_id 124? – Ellesedil

+0

@ Ellesedil, das ist richtig, die Datensätze 13 und 14 in dieser Tabelle zeigen zwei verschiedene Parameter IDs mit der gleichen Abzug ID, so dass dies eine der Review IDs wäre, die ich erfassen möchte. – jblue

Antwort

6
SELECT * FROM table t1 INNER JOIN (
    SELECT review_id, deduction_id FROM table 
    GROUP BY review_id, deduction_id 
    HAVING COUNT(parameter_id) > 1 
) t2 ON t1.review_id = t2.review_id AND t1.deduction_id = t2.deduction_id; 

http://www.sqlfiddle.com/#!3/d858f/3

Wenn es möglich ist, eine exakte Kopie zu haben, und das ist in Ordnung, können Sie die HAVING-Klausel ändern, um COUNT (DISTINCT parameter_id).

+0

Diese Antwort liefert die korrekten Ergebnisse.Es endete mit dem von Michael L vorgeschlagenen CTE, da die Tabelle im Bild das Ergebnis von ist Noch eine weitere Abfrage, aber diese Antwort hat mir bekommen, was ich gesucht habe. Vielen Dank! – jblue

6
Select ReviewID, deduction_ID from Table 
Group By ReviewID, deduction_ID 
Having count(ReviewID) > 1 

http://www.sqlfiddle.com/#!3/6e113/3 wurde ein Beispiel

+0

Dies berücksichtigt die Parameter-ID nicht, die erforderlich ist, um festzustellen, ob eine Überprüfungs-ID fehlerhaft ist oder nicht. – Ellesedil

+0

Wenn Sie das 'Habt Zählen (DISTINCT ReviewID)> 1 'dann würden Sie wissen, wenn es zwei verschiedene reviewId (anstatt nur die gleiche mehrere Male. –

+0

@ Ellesedil, richtig, die Parameter-ID muss berücksichtigt werden Jede Deduktions - ID ist eindeutig und kann nur auf einen einzelnen Parameter (ID) angewendet werden – jblue

3

Wenn ich verstehe die Kriterien: Für jede Kombination von ReviewID und deduction_id Sie nur eine parameter_id haben und Sie eine Abfrage, die ein Ergebnis ohne die ReviewIDs erzeugt, die diese Vorschriften (und nicht zu identifizieren, jene Zeilen, die tun) brechen . Dies wird das tun:

;WITH review_errors AS (
    SELECT ReviewID 
    FROM test 
    GROUP BY ReviewID,deduction_ID 
    HAVING COUNT(DISTINCT parameter_id) > 1 
) 
SELECT t.* 
FROM test t 
    LEFT JOIN review_errors r 
    ON t.ReviewID = r.ReviewID 
WHERE r.ReviewID IS NULL 

zu erklären: review_errors ist ein common table expression (man denke an mich als Unter Abfrage mit dem Namen, der nicht die Hauptabfrage nicht verunstaltet). Es wählt die ReviewIDs aus, die die Kriterien verletzen. Wenn Sie den Join verlassen, werden alle Zeilen aus der linken Tabelle ausgewählt, unabhängig davon, ob sie mit der richtigen Tabelle übereinstimmen und nur die Zeilen aus der rechten Tabelle, die mit der linken Tabelle übereinstimmen. Zeilen, die nicht übereinstimmen, haben in den Spalten für die rechte Tabelle Nullwerte. Durch Angabe von WHERE r.ReviewID IS NULL eliminieren Sie die Zeilen aus der linken Tabelle, die der rechten Tabelle entsprechen.

SQL Fiddle

+0

Ich denke, Sie haben es rückwärts, wie das OP angibt, er Datensätze wie review_id 114 identifizieren möchte, die eine ungültige Aufzeichnung ist Logik, die Sie geschrieben haben, schließen Sie alle Instanzen einer Überprüfungs-ID aus, auch wenn sie einige Datensätze enthält, die "gut" sind. – Ellesedil

+0

Schön genug - ich hätte es falsch verstehen können. Es ist eine triviale Modifikation und [h Hier ist die SQL Fiddle] (http://www.sqlfiddle.com/#!3/4dc10/2) –

+0

Sie müssen bei deduction_id auch beitreten. Andernfalls könnten Sie gute Datensätze aus einer Überprüfungs-ID auswählen, die fehlerhafte Datensätze enthält. Ich mag den CTE aber. – Ellesedil

Verwandte Themen