sql >> Databasteknik >  >> RDS >> PostgreSQL

Fråga där kolumnen för främmande nyckel kan vara NULL

Om det finns "ingen rad alls för uid" och du JOIN som du gör får du ingen rad som resultat. Använd LEFT [OUTER] JOIN istället:

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;

Du behöver också parentesen jag lade till på grund av operatörsföreträde . (AND binder före OR ).

Jag använder IS DISTINCT FROM istället för != i det sista WHERE-tillståndet eftersom återigen login.access kan vara NULL , som inte skulle kvalificera sig.

Men eftersom du bara verkar vara intresserad av kolumner från tabell u Till att börja med skulle denna alternativa fråga vara mer elegant:

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
   );

Detta alternativ har den ytterligare fördelen att du alltid får en rad från u , även om det finns flera rader i u_org eller login .




  1. Gruppera mysql-resultat efter kategori och visa dem i grupper under varje kategori

  2. Spring Data Rest:Datum är null-fråga ger ett postgres-undantag

  3. Komplex MySQL GÅ MED MED GRUPP BY

  4. Skapa ett foder från flera rälsmodeller, effektivt?