Nếu "không có hàng nào cho uid" và bạn JOIN
như bạn làm, bạn nhận được không có hàng kết quả là. Sử dụng LEFT [OUTER] JOIN
thay vào đó:
SELECT u.uid, u.fname, u.lname
FROM u
LEFT JOIN u_org o ON u.uid = o.uid
LEFT JOIN login l ON u.uid = l.uid
WHERE (o.orgid = 2 OR o.orgid IS NULL)
AND l.access IS DISTINCT FROM 4;
Ngoài ra, bạn cần dấu ngoặc đơn mà tôi đã thêm vì ưu tiên toán tử
. (AND
liên kết trước OR
).
Tôi sử dụng IS DISTINCT FROM
thay vì !=
trong điều kiện WHERE cuối cùng vì login.access
có thể là NULL
, sẽ không đủ điều kiện.
Tuy nhiên, vì bạn dường như chỉ quan tâm đến các cột từ bảng u
để bắt đầu, truy vấn thay thế này sẽ thanh lịch hơn:
SELECT u.uid, u.fname, u.lname
FROM u
WHERE (u.uid IS NULL OR EXISTS (
SELECT 1
FROM u_org o
WHERE o.uid = u.uid
AND o.orgid = 2
))
AND NOT EXISTS (
SELECT 1
FROM login l
WHERE l.uid = u.uid
AND l.access = 4
);
Giải pháp thay thế này có thêm một lợi thế nữa là bạn luôn nhận được một hàng từ u
, ngay cả khi có nhiều hàng trong u_org
hoặc login
.