Sepertinya Anda menginginkan anti-gabung , yaitu Anda harus terlebih dahulu menetapkan ID pengguna mana yang memiliki IsFinal = 1
, lalu gunakan kumpulan hasil itu untuk mengembalikan semua ID pengguna bukan dalam daftar itu.
Ada berbagai cara untuk menerapkan anti-gabung.
-
NOT IN
:SELECT * FROM atable WHERE UserID NOT IN ( SELECT UserID FROM atable WHERE IsFinal = 1 );
-
NOT EXISTS
:SELECT * FROM atable t1 WHERE NOT EXISTS ( SELECT * FROM atable t2 WHERE t1.UserID = t2.UserID AND t2.IsFinal = 1 );
-
LEFT JOIN
+WHERE IS NULL
:a)
SELECT * FROM atable t1 LEFT JOIN ( SELECT * FROM atable WHERE IsFinal = 1 ) t2 ON t1.UserID = t2.UserID WHERE t2.UserID IS NULL;
b)
SELECT * FROM atable t1 LEFT JOIN atable t2 ON t1.UserID = t2.UserID AND t2.IsFinal = 1 WHERE t2.UserID IS NULL;
Mungkin saja mereka akan sama-sama efisien dalam database Anda, tetapi mungkin ide yang baik untuk menguji masing-masing dari mereka setidaknya menghindari berakhir dengan satu yang berkinerja lebih buruk daripada yang lain.