Zdá se, že chcete anti-join , tj. nejprve musíte určit, která uživatelská ID mají IsFinal = 1
, pak použijte tuto sadu výsledků k vrácení všech ID uživatelů ne v tomto seznamu.
Anti-join lze implementovat různými způsoby.
-
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;
Může se tak stát, že budou ve vaší databázi stejně výkonné, ale přesto může být dobrý nápad otestovat každý z nich, abyste se alespoň vyhnuli tomu, že skončí s tím, který má horší výkon než ostatní.