Bất cứ khi nào tôi cần kiểm tra sự tồn tại của một số hàng trong bảng, tôi có xu hướng viết luôn một điều kiện như:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT * -- This is what I normally write
FROM another_table
WHERE another_table.b = a_table.b
)
Một số người khác viết nó như:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT 1 --- This nice '1' is what I have seen other people use
FROM another_table
WHERE another_table.b = a_table.b
)
Khi điều kiện NOT EXISTS
thay vì EXISTS
: Trong một số trường hợp, tôi có thể viết nó với một LEFT JOIN
và một điều kiện bổ sung (đôi khi được gọi là antijoin ):
SELECT a, b, c
FROM a_table
LEFT JOIN another_table ON another_table.b = a_table.b
WHERE another_table.primary_key IS NULL
Tôi cố gắng tránh nó bởi vì tôi nghĩ rằng ý nghĩa không rõ ràng, đặc biệt khi những gì primary_key
không rõ ràng hoặc khi khóa chính hoặc điều kiện tham gia của bạn là nhiều cột (và bạn có thể dễ dàng quên một trong các cột). Tuy nhiên, đôi khi bạn duy trì mã được viết bởi người khác ... và nó chỉ ở đó.
Có sự khác biệt nào (ngoài phong cách) để sử dụng
SELECT 1
thay thếSELECT *
không?
Có trường hợp góc nào mà nó không hành xử giống như vậy không?Mặc dù những gì tôi đã viết là (AFAIK) tiêu chuẩn SQL: Có sự khác biệt như vậy đối với các cơ sở dữ liệu / phiên bản cũ hơn không?
Có bất kỳ lợi thế về việc khám phá viết một antijoin?
Các nhà hoạch định / tối ưu hóa đương đại có đối xử với nó khác vớiNOT EXISTS
điều khoản không?
EXISTS (SELECT FROM ...)
.