Det ser ud til, at du vil have en anti-join , dvs. du skal først fastslå, hvilke bruger-id'er der har IsFinal = 1
, og brug derefter dette resultatsæt til at returnere alle bruger-id'er ikke på den liste.
Der er forskellige måder at implementere en anti-join på.
-
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;
Det kan ske, at de vil være lige så effektive i din database, men det kan stadig være en god idé at teste hver af dem for i det mindste at undgå at ende med en, der klarer sig dårligere end de andre.