Ich habe zwei Tabellen, eine hat einen Primärschlüssel, die andere einen Fremdschlüssel.
Ich möchte Daten nur dann aus der Primärtabelle abrufen, wenn die Sekundärtabelle keinen Eintrag enthält, der ihren Schlüssel enthält. Eine Art Gegenteil eines einfachen inneren Joins, der nur Zeilen zurückgibt, die durch diesen Schlüssel zusammengefügt werden.
B.Key IS NULL
aber wir noch vergleichbarA.Key = B.Key
?Im Allgemeinen ,
(NOT) EXISTS
ist eine bessere Wahl dann(NOT) IN
oder(LEFT) JOIN
quelle
LEFT JOIN
übertrifft esNOT EXIST
Verwenden Sie einen linken Join "nicht vorhanden":
quelle
quelle
P.key = S.key
und dann sagenwhere S.key IS NULL
, macht das dann nicht auch P.key null?Eine andere Lösung ist:
quelle
Wenn Sie die Spalten aus der ersten Tabelle auswählen möchten, die auch in der zweiten Tabelle vorhanden sind, können Sie sie in diesem Fall auch verwenden
EXCEPT
. In diesem Fall können auch die Spaltennamen unterschiedlich sein, der Datentyp sollte jedoch gleich sein.Beispiel:
quelle
Dies war in COGNOS hilfreich, da das Erstellen einer SQL-Anweisung "Nicht in" in Cognos zulässig war, die Ausführung jedoch zu lange dauerte. Ich hatte Tabelle A manuell codiert, um sie in Cognos als A.key "nicht in" B.key mit Tabelle B zu verbinden, aber die Abfrage dauerte zu lange / gab nach 5 Minuten keine Ergebnisse zurück.
Für alle anderen, die nach einer "NOT IN" -Lösung in Cognos suchen, habe ich Folgendes getan. Erstellen Sie eine Abfrage, die Tabelle A und B mit einem LEFT JOIN in Cognos verbindet, indem Sie den Verknüpfungstyp auswählen: Tabelle A. Der Schlüssel hat in Tabelle B Werte von "0 bis N" und fügt dann einen Filter (diese entsprechen den Where-Klauseln) für: Tabelle B hinzu Schlüssel ist NULL.
Lief schnell und wie ein Zauber.
quelle