2016-11-11 3 views

Antwort

1

existiert nicht funktioniert perfekt und ist der logisch geradlinig Weg, dies zu schreiben, aber ist nicht immer die performant Option. Wenn Sie nicht auf das DB-System angewiesen sind, können Sie die Abfrage abflachen, um sie zeilenweise zu vermeiden. Mit dieser einfachen Abfrage wird das DB-System es wahrscheinlich herausfinden, aber Sie können es in einer abgeflachten Weise schreiben.

SELECT a.* 
    FROM TableA a LEFT JOIN TableB b ON a.clientId = b.clientid 
            AND b.clientcode = 'TRN' 
WHERE b.ClientId IS NULL 

Um dies ein wenig die linke zu erklären beitreten Tabelle B Tabelle A, in dem die ID des Spiels und die clientcode ist ‚TRN‘ beitreten, aber alle Einträge in der Tabelle A und haben NULLs für Tabelle B halten, wenn ein Datensatz existiert nicht mit 'TRN', also ist die NULL-Prüfung äquivalent zu der, die in der anderen Abfrage nicht existiert, vermeidet aber die zeilenweise Überprüfung einer korrelierten Unterabfrage und sollte viel schneller sein.

+0

Interessante Variante! Danke Evan. – Dev

+0

* muss für jede Zeile einzeln ausgeführt werden *: nicht wahr. Es gibt keine Regel, die eine SQL-Implementierung auf eine bestimmte * Weise * einschränkt, um etwas zu tun. Und die meisten DBMS "flatten" tatsächlich korrelierte Unterabfragen, wenn dies machbar ist. Wenn Sie in Ihrem DBMS ein Beispiel für zwei logisch äquivalente Minimalabfragen finden, in denen sich eine korrelierte Unterabfrage wesentlich von einer äußeren Verknüpfung unterscheidet und dies nicht dokumentiert ist, würde ich vorschlagen, einen Problembericht einzureichen. Es ist kein Fehler, aber es ist eine Optimierungsmöglichkeit. –

+0

@ JamesK.Lowden Ich habe meinen Beitrag bearbeitet, um ihn weicher zu machen und die DBMS-Optimierung der Abfrage zu ermöglichen. –

Verwandte Themen