sql >> Databáze >  >> RDS >> PostgreSQL

Dotaz, kde sloupec cizího klíče může mít hodnotu NULL

Pokud neexistuje "vůbec žádný řádek pro uid" a JOIN stejně jako vy, nemáte žádný řádek jako výsledek. Použijte LEFT [OUTER] JOIN místo toho:

SELECT u.uid, u.fname, u.lname
FROM   u 
LEFT   JOIN u_org o ON u.uid = o.uid 
LEFT   JOIN login l ON u.uid = l.uid 
WHERE (o.orgid = 2 OR o.orgid IS NULL)
AND    l.access IS DISTINCT FROM 4;

Také potřebujete závorku, kterou jsem přidal kvůli Priorita operátora . (AND se váže před OR ).

Používám IS DISTINCT FROM místo != v poslední podmínce WHERE, protože opět login.access může být NULL , která by nesplňovala podmínky.

Protože se však zdá, že vás zajímají pouze sloupce z tabulky u pro začátek by tento alternativní dotaz byl elegantnější:

SELECT u.uid, u.fname, u.lname
FROM   u
WHERE (u.uid IS NULL OR EXISTS (
   SELECT 1
   FROM   u_org o
   WHERE  o.uid = u.uid
   AND    o.orgid = 2
   ))
AND NOT EXISTS (
   SELECT 1
   FROM   login l
   WHERE  l.uid = u.uid
   AND    l.access = 4
   );

Tato alternativa má navíc tu výhodu, že vždy dostanete jeden řádek od u , i když je v u_org více řádků nebo login .




  1. předáním parametru Date k vytvoření dotazu na časové období

  2. použití aliasu splynout v podmínce:splynout (max (případ, kdy hodnota, potom hodnota) jako alias

  3. Rozdíl mezi Drop a Drop Purge v Oracle

  4. Ztratilo se připojení k serveru MySQL během dotazu na náhodné jednoduché dotazy