sql >> Database >  >> RDS >> PostgreSQL

Vraag waar de externe sleutelkolom NULL kan zijn

Als er "helemaal geen rij is voor de uid", en je JOIN zoals jij krijgt, krijg je geen rij als resultaat. Gebruik LEFT [OUTER] JOIN in plaats daarvan:

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;

Je hebt ook de haakjes nodig die ik heb toegevoegd vanwege operatorvoorrang . (AND bindt vóór OR ).

Ik gebruik IS DISTINCT FROM in plaats van != in de laatste WHERE-voorwaarde omdat, nogmaals, login.access kan NULL zijn , die niet in aanmerking zouden komen.

Aangezien u echter alleen geïnteresseerd lijkt te zijn in kolommen uit tabel u om te beginnen zou deze alternatieve vraag eleganter zijn:

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

Dit alternatief heeft als bijkomend voordeel, dat je altijd één . krijgt rij van u , zelfs als er meerdere rijen zijn in u_org of login .




  1. PL/SQL die queryresultaten toewijst aan een CLOB

  2. SQL Server :SUM() van meerdere rijen inclusief waar-clausules

  3. hoe te werken met dynamische data en google charts?

  4. Bij fout volgende type foutafhandeling hervatten in PL/SQL oracle