2009-12-17 16 views

risposta

80

Sì, vedere l'esempio su 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

L'esempio di Wikipedia sta formando un 'UNION' di tre query, in cui il tuo esempio ne ha solo due. Puoi spiegare la differenza per favore? –

+2

@GrahamBorland: il codice nella mia risposta è stato preso da Wikipedia. Penso che Wikipedia sia stata modificata da quando ho pubblicato. La differenza è che usano un join interno e due selezioni per ottenere i record non corrispondenti (uno per ogni tabella). La query nella mia risposta combina il join interno e uno dei select in un join sinistro. È (A) + (B) + (C) rispetto a (A + B) + (C). –

+0

Questo è ancora il modo con l'ultimo SQLite (3.7.x) o può essere usato un OUTER JOIN standard? – 01es

3

seguito il commento di Jonathan Leffler, qui è una risposta alternativa a quella di 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 

Vedi here per la fonte originale e ulteriori esempi SQLite.

+3

Penso che WHERE employee.DepartmentID IS NULL è un must, anche se non ti dispiace di ottenere duplicati riga – Xenione

+1

Se non sbaglio, questo dovrebbe avere lo stesso risultato, l'UNION abbinerà i record duplicati, ma è meno efficiente del UNIONE TUTTI. –

+1

UNION (_without_ ALL) rimuove le righe duplicate – cowbert