Trong SQLite, EXCEPT
toán tử có thể được sử dụng để tạo một phức hợp SELECT
câu lệnh trả về tập hợp con các hàng được trả về bởi SELECT
bên trái không được trả về bởi đúng SELECT
.
Ví dụ
Giả sử chúng ta có các bảng sau:
SELECT * FROM Teachers;
SELECT * FROM Students;
Kết quả:
TeacherId TeacherName --------- ----------- 1 Warren 2 Ben 3 Cathy 4 Cathy 5 Bill 6 Bill StudentId StudentName --------- ----------- 1 Faye 2 Jet 3 Spike 4 Ein 5 Warren 6 Bill
Chúng ta có thể sử dụng EXCEPT
toán tử để trả lại giáo viên không phải là sinh viên:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
Kết quả:
TeacherName ----------- Ben Cathy
Vì vậy, chúng tôi chỉ nhận được các giá trị xuất hiện trong Teachers
bảng cũng không xuất hiện trong Students
bàn.
Chúng ta có thể nhận được các kết quả khác nhau, tùy thuộc vào bảng nào ở bên trái và bảng nào ở bên phải. Đây là một ví dụ đặt Students
bảng bên trái và Teachers
ở bên phải:
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
Kết quả:
StudentName ----------- Ein Faye Jet Spike
Lần này, chúng tôi có những sinh viên không phải là giáo viên.
EXCEPT
của SQLite toán tử chỉ trả về các hàng riêng biệt. Vì vậy, trong ví dụ của chúng tôi, chỉ một hàng được trả về cho Cathy
, mặc dù có hai giáo viên có tên đó.
Một số RDBMS khác cho phép chúng tôi bao gồm các bản sao trong kết quả bằng cách chấp nhận ALL
tùy chọn từ khóa với EXCEPT
của chúng nhưng SQLite thì không (ít nhất, không phải tại thời điểm viết bài). Vui lòng kiểm tra tài liệu của SQLite trong trường hợp có bất kỳ điều gì thay đổi.
Một giải pháp thay thế
Có thể nhận được kết quả tương tự mà không cần sử dụng EXCEPT
nhà điều hành. Ví dụ:chúng tôi có thể viết lại ví dụ đầu tiên của chúng tôi thành ví dụ này:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
Kết quả:
TeacherName ----------- Ben Cathy