Det verkar som om du vill ha en anti-join , det vill säga du måste först fastställa vilka användar-ID:n som har IsFinal = 1
, använd sedan resultatuppsättningen för att returnera alla användar-ID:n inte i den listan.
Det finns olika sätt att implementera en anti-join.
-
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 hända att de kommer att vara lika effektiva i din databas, men det kan ändå vara en bra idé att testa var och en av dem för att åtminstone undvika att hamna i en som presterar sämre än de andra.