2016-10-06 3 views
-1

Zum Beispiel haben zwei Tabellen viele (oder hat eine) Beziehung. Autor und Bücher. Zum Beispiel wollen wir prüfen, ob dies ein neuer Autor ist, der keine Bücher geschrieben hat.SQLite3 - Warum LEFT JOIN unterscheidet sich von anderen RDBMSes?

SELECT authors.id 
FROM authors 
LEFT JOIN books ON authors.id = books.author_id AND books.id IS NULL 

richtig in jedem RDBMS Dies funktioniert: MySQL, PostgreSQL, SQL Server, Oracle vielleicht, aber nicht in SQLite3. In SQLite3 muss der letzte Teil zu WHERE bewegt werden:

SELECT authors.id 
FROM authors 
LEFT JOIN books ON authors.id = books.author_id 
WHERE books.id IS NULL 

richtig arbeiten. Warum?

+0

Spielzeug-Datenbanken sind so. Sie arbeiten für eine überwältigende Mehrheit von Anwendungsfällen, was sie enorm nützlich macht, aber man muss lernen, mit ihren vielen Mängeln zu leben. – dasblinkenlight

Antwort

2

Sie sind falsch, dass die Version mit der Bedingung in der ON Klausel filtert. Zum Beispiel ist here eine MySQL SQL Fiddle, die zeigt, dass das Setzen der Bedingung in die ON-Klausel zwei Zeilen zurückgibt.

Dies ist der richtige Weg, Autoren ohne Bücher zu bekommen, mit LEFT JOIN:

SELECT authors.id 
FROM authors LEFT JOIN 
    books 
    ON authors.id = books.author_id 
WHERE books.id IS NULL; 

Diese Autoren herausfiltert, die Bücher haben, die Autoren ohne Bücher zu verlassen. Die Logik von LEFT JOIN ist einfach: Behalten Sie alle Zeilen in der ersten Tabelle bei, unabhängig davon, ob die ON Bedingungen als wahr, falsch oder NULL ausgewertet werden.

Die Bedingung in die ON Klausel hat eine andere Logik. Es wird alle Autoren zurückgeben. Es gibt keine Filterung.

Ich habe eine vage Erinnerung, dass einige Versionen einiger Datenbanken einen Fehler haben, wo solch ein konstanter Ausdruck als Filterklausel behandelt wird. Das ist jedoch nicht korrekt. Was Sie als "Ausnahme" betrachten, ist korrekt und sollte in jeder Datenbank funktionieren.

+0

Ja, Sie haben recht, ich glaube ich habe es mit 'INNER JOIN' verwechselt, wenn es' INNER JOIN' ist, dann funktionieren diese Bedingungen in 'ON' genauso wie in' WHERE', wie ich mich erinnere. –