2009-12-17 13 views

Antwort

80

Ja, siehe das Beispiel unter Wikipedia.

SELECT employee.*, department.* 
FROM employee 
     LEFT JOIN department 
      ON employee.DepartmentID = department.DepartmentID 
UNION ALL 
SELECT employee.*, department.* 
FROM department 
     LEFT JOIN employee 
      ON employee.DepartmentID = department.DepartmentID 
WHERE employee.DepartmentID IS NULL 
+0

Das Wikipedia-Beispiel bildet eine "UNION" von drei Abfragen, wobei Ihr Beispiel nur zwei enthält. Kannst du bitte den Unterschied erklären? –

+2

@GrahamBorland: Der Code in meiner Antwort wurde aus Wikipedia genommen. Ich denke Wikipedia wurde bearbeitet, seit ich gepostet habe. Der Unterschied besteht darin, dass sie einen inneren Join und zwei Selects verwenden, um die nicht übereinstimmenden Datensätze zu erhalten (einen für jede Tabelle). Die Abfrage in meiner Antwort kombiniert den inneren Join und einen der Selects zu einem linken Join. Es ist (A) + (B) + (C) verglichen mit (A + B) + (C). –

+0

Ist dies noch der Weg mit der neuesten SQLite (3.7.x) oder kann ein Standard OUTER JOIN verwendet werden? – 01es

3

Jonathan Leffler Kommentar Folgen, hier ist eine alternative Antwort auf die von Mark Byers':

SELECT * FROM table_name_1 LEFT OUTER JOIN table_name_2 ON id_1 = id_2 
UNION 
SELECT * FROM table_name_2 LEFT OUTER JOIN table_name_1 ON id_1 = id_2 

here Siehe Quelle und weitere SQLite Beispiele.

+3

Ich denke, WHERE employee.DepartmentID IS NULL ist ein Muss, obwohl Sie nichts dagegen haben, Duplikate Zeile – Xenione

+1

zu bekommen Wenn ich nicht irre, sollte dies das gleiche Ergebnis haben, wird die UNION doppelte Datensätze übereinstimmen, ist aber weniger effizient als die UNION ALLE. –

+1

UNION (_without_ ALL) entfernt doppelte Zeilen – cowbert