2009-12-17 37 views

Trả lời

80

Có, xem ví dụ trên 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

Ví dụ Wikipedia đang tạo thành một 'UNION' trong ba truy vấn, trong đó ví dụ của bạn chỉ có hai. Bạn có thể giải thích sự khác biệt không? –

+2

@GrahamBorland: Mã trong câu trả lời của tôi được lấy từ Wikipedia. Tôi nghĩ Wikipedia đã được chỉnh sửa kể từ khi tôi đăng. Sự khác biệt là chúng sử dụng một phép nối bên trong và hai lựa chọn để lấy các bản ghi không khớp (một cho mỗi bảng). Truy vấn trong câu trả lời của tôi kết hợp phép nối bên trong và một trong các phép chọn vào một phép nối trái. Đó là (A) + (B) + (C) so với (A + B) + (C). –

+0

Nó vẫn là cách với SQLite mới nhất (3.7.x) hoặc có thể một tiêu chuẩn OUTER JOIN được sử dụng? – 01es

3

Sau comment Jonathan Leffler của, đây là một câu trả lời thay thế cho rằng 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 

Xem here cho nguồn gốc và các ví dụ SQLite thêm.

+3

Tôi nghĩ rằng nơi nào nhân viên.DepartmentID IS NULL là phải, mặc dù bạn không nhớ để có được hàng trùng lặp – Xenione

+1

Nếu tôi không nhầm, điều này cần phải có cùng một kết quả, UNION sẽ khớp với bản ghi trùng lặp, nhưng ít hiệu quả hơn UNION ALL. –

+1

UNION (_without_ ALL) xóa các hàng trùng lặp – cowbert

Các vấn đề liên quan