Het lijkt erop dat je een anti-join . wilt , d.w.z. u moet eerst vaststellen welke gebruikers-ID's IsFinal = 1
hebben en gebruik vervolgens die resultatenset om alle gebruikers-ID's niet . te retourneren in die lijst.
Er zijn verschillende manieren om een anti-join te implementeren.
-
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;
Het kan gebeuren dat ze even efficiënt zijn in uw database, maar het kan toch een goed idee zijn om ze allemaal te testen om op zijn minst te voorkomen dat u er een krijgt die slechter presteert dan de andere.