2010-09-27 12 views
6

Jak mogę uprościć wiele zapytań "nie w"? Jest to skuteczne, aby korzystać z wielu podzapytania: Nie w (...), a nie w (..), a nie w (..)używanie NOT IN dla wielu tabel

używam licznika (przepraszam zapomniałem o tym)

Select count (VisitorID) 

from Company 

where VisitorID not in (select VisitorID from UserLog where ActionID = 2) 

and VisitorID not in (select VisitorID from Supplies where productID = 4) 
+0

możesz dać wyobrażenie o wielkości tabel? A co z selektywnością dwóch sub-selekcji? Jedna trzecia, 1 na 100? – pascal

Odpowiedz

6
Select count (VisitorID) 

from Company C 
where 
NOT EXISTS (select * from UserLog U where ActionID = 2 AND C.VisitorID = U.VisitorID) 
AND 
NOT EXISTS (select * from Supplies S where productID = 4 AND S.VisitorID = U.VisitorID) 

dlaczego nie istnieje?

  • NIE

    IN: żadnych wartości NULL VisitorID w UserLog lub dostaw oznacza nie pasuje

  • (LEFT JOIN): wiele wierszy wyjściowych jeśli wiele UserLog lub dostaw na VisitorID. Potrzeby DISTINCT która zmienia plan

Ogólnie NIE ISTNIEJE to jedyna poprawna opcja

2

można użyć Unia dla grupy id

Select User 

from Company 

where VisitorID not in (
select VisitorID from UserLog where ActionID = 2 
UNION 
select VisitorID from Supplies where productID = 4 
) 
+1

to działało dla mnie. dzięki. – tshenolo