Fórum Root.cz
Hlavní témata => Server => Téma založeno: Boris Michalko 08. 07. 2010, 10:17:14
-
Ahoj,
potřeboval bych vysvětlit jak se přesně chová operátor NOT IN v PostgreSQL ve verzi 8.3.
Mám jeden dotaz:
select count(distinct permusername) from spacepermissions where spaceid = 112 and permusername IN (select permusername from spacepermissions where spaceid = 112 group by permusername having count(permtype) > 2) and permusername is not null;
Tady mi operátor IN funguje tak, jak bych předpokládal. Vybere mi 14 záznamů z 650.
Ale když změním dotaz na:
select count(distinct permusername) from spacepermissions where spaceid = 112 and permusername NOT IN (select permusername from spacepermissions where spaceid = 112 group by permusername having count(permtype) > 2) and permusername is not null;
nevybere mi doplněk množiny, tj. 636 záznamů ale 0 záznamů.
Děkuji
Boris
-
druhé co by me napadlo je udelat toto
select count(distinct permusername) from spacepermissions where spaceid = 112 and permusername IN (select permusername from spacepermissions where spaceid = 112 group by permusername having count(permtype) <= 2) and permusername is not null;
ale proc se to chova tak jak se to chova v pripade not in nevim
-
čo pridať do subquery jeden NOT NULL? NULLy robia paseku kade-tade.
-
NOT IN operátor porovnává hodnotu s každým prvkem výsledku subselectu, a pokud subselect obsahuje byť jen jediný NULL, pak nemůže nastat shoda neboť NULL není rovna žádná hodnota. Řešením by mělo být WHERE val IS NOT NULL v subselectu.
-
Děkuji za odpovědi.
Přidání podmínky permusername is not null do subselect-u vyřešilo problém.
Zdraví
Boris