Sự khác biệt là khi bạn sử dụng exists
- truy vấn bên trong thường phụ thuộc vào truy vấn chính (nghĩa là sử dụng các cột từ nó và do đó không thể được thực thi riêng biệt) và, vì vậy, đối với mỗi hàng của truy vấn chính, nó sẽ kiểm tra xem một số dữ liệu được truy xuất bởi truy vấn phụ có tồn tại hay không.
Vấn đề của truy vấn đầu tiên của bạn là truy vấn con bên trong khối tồn tại dù sao cũng không phụ thuộc vào các cột truy vấn chính, đó là một truy vấn riêng biệt luôn trả về một hàng có 1
, vì vậy, đối với bất kỳ hàng nào của truy vấn chính, kết quả của exists
sẽ luôn là true
. Vì vậy, truy vấn đầu tiên của bạn chỉ tương đương với
SELECT distinct(company_id)
FROM user
WHERE user.user_id = 123
AND user.company_id IS NOT NULL
Xem thêm fiddle