Jika "tidak ada baris sama sekali untuk uid", dan Anda JOIN
seperti yang Anda lakukan, Anda mendapatkan tidak ada baris sebagai hasil. Gunakan LEFT [OUTER] JOIN
sebagai gantinya:
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;
Juga, Anda memerlukan tanda kurung yang saya tambahkan karena diutamakan operator
. (AND
mengikat sebelum OR
).
Saya menggunakan IS DISTINCT FROM
bukannya !=
dalam kondisi WHERE terakhir karena, sekali lagi, login.access
mungkin NULL
, yang tidak memenuhi syarat.
Namun, karena Anda sepertinya hanya tertarik pada kolom dari tabel u
untuk memulainya, kueri alternatif ini akan lebih elegan:
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
);
Alternatif ini memiliki keuntungan tambahan, yaitu Anda selalu mendapatkan satu baris dari u
, bahkan jika ada beberapa baris di u_org
atau login
.