2016-07-27 16 views
0

Ich habe eine Abfrage geschrieben, um eine Tabelle anhand von Kriterien zu filtern, die in einer Mastertabelle gefunden werden, und dann Zeilen zu entfernen, die einer dritten Tabelle entsprechen. Ich führe die Abfrage in Access aus, deshalb kann ich MINUS nicht verwenden. Es funktioniert, aber ich fand, dass es doppelte Zeilen für einige, aber nicht alle der ausgewählten Datensätze zurückgibt. Ich habe es mit DISTINCT behoben, aber ich weiß nicht, warum es überhaupt Duplikate zurückgeben würde. Es ist eine ziemlich einfache Abfrage:Warum benötigt diese SQL-Abfrage DISTINCT?

select distinct sq.* 
from 
    (select List_to_Check.*, Master_List.SELECTION_VAR 
     from List_to_Check 
     left join Master_List 
     on List_to_Check.SUB_ID = Master_List.SUB_ID 
     where Master_List.SELECTION_VAR = 'criteria' 
    ) as sq 
left join List_to_Exclude 
on sq.SUB_ID = List_to_Exclude.SUB_ID 
where List_to_Exclude.SUB_ID is null 
; 

Edit: Die Beziehungen zwischen allen drei Tabellen sind 1-zu-1 auf dem SUB_ID var. In Kombination mit einem LINKEN JOIN würde ich eine Zeile pro ID erwarten.

+0

Es ist schwer zu sagen, ohne eine Beschreibung Ihrer Tabellen, Daten und die Beziehungen zwischen den Tabellen (1 zu 1, 1 zu N, etc.). – sstan

+0

Wäre schwer zu sagen, ohne genaue Beispieltabellendaten zu haben. Im Allgemeinen wird distinct nicht benötigt und wird durch richtige "group by" -Anweisungen gelöst. – topshot

+0

@ststan die Beziehungen zwischen allen drei Tabellen sind 1 zu 1 auf der SUB_ID var. Deshalb würde ich keine Duplikate erwarten. – Rominus

Antwort

1

Ich empfehle Ihnen, Ihre Anfrage auseinander zu brechen und auf Duplikate zu prüfen. Meine Vermutung ist, dass es Ihre Daten sind/die Sub_ID ist nicht sehr einzigartig.

Beginnen Sie mit Ihrer Unterabfrage, da Sie alle diese Spalten zurückgeben. Wenn Sie dort Duplikate erhalten, wird Ihre Abfrage unabhängig davon, was in Ihrer Ausschlusstabelle enthalten ist, Duplikate zurückgeben.

Sobald Sie diese Duplikate aufgeklärt haben, überprüfen Sie die Ausnahmetabelle für doppelte sub_Id.

Um Zeit bei der Fehlersuche zu sparen, sollten Sie die zurückgegebenen Werte begrenzen, wenn bekannte Täter doppelt vorhanden sind, damit Sie sich auf die Besonderheiten dieser Daten konzentrieren können.

Ich bin nicht sicher, ob dies ein Problem ist, aber schauen Sie in die Logik auf

on List_to_Check.SUB_ID = 
    Master_List.SUB_ID 
where Master_List.SELECTION_VAR = 'criteria' 

Wo Klauseln über die Daten auf der rechten Seite einer linken äußeren Verknüpfung kann nicht die Daten zurückkehren Sie erwarten. Versuchen Sie dies und sehen, was passiert:

on List_to_Check.SUB_ID = Master_List.SUB_ID 
and Master_List.SELECTION_VAR = 'criteria' 
+0

Nun, das war es. Ich zeigte auf die nicht-deduplizierte Version von Master_List .... falscher Codealarm .... – Rominus

0

Die innere Abfrage verknüpft List_to_Check und Master aber die äußere Abfrage verbindet List_to_Exclude mit Subscriber (vielleicht können Sie die Namen ändern Ich nenne diese drei Tabellen)

Duplikate vermeiden Sie eine der Tabelle verwenden, müssen sowohl die fragt nach innen und nach außen. Dies wird Duplikate vermeiden.

+0

Es gibt nur drei Tabellen, 'sq' soll das Ergebnis der inneren Abfrage sein, keine tatsächliche Tabelle. – Rominus

+0

sicher, sollte einer der Tabellennamen in beiden erscheinen, so dass die Zeilen übereinstimmen oder sonst wird es doppelte Zeilen richtig? – amitmah

Verwandte Themen