sql >> Database teknologi >  >> RDS >> PostgreSQL

Forespørgsel, hvor fremmednøglekolonnen kan være NULL

Hvis der er "ingen række overhovedet for uid", og du JOIN ligesom du gør, får du ingen række som resultat. Brug LEFT [OUTER] JOIN i stedet:

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 har også brug for den parentes, jeg tilføjede på grund af operatørpræference . (AND binder før OR ).

Jeg bruger IS DISTINCT FROM i stedet for != i den sidste WHERE-tilstand, fordi igen login.access kan være NULL , som ikke ville kvalificere sig.

Men da du kun ser ud til at være interesseret i kolonner fra tabel u til at begynde med ville denne alternative forespørgsel være mere 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
   );

Dette alternativ har den yderligere fordel, at du altid får en række fra u , selvom der er flere rækker i u_org eller login .




  1. Ugentlig timefordelingsproblem i Rails og Postgresql

  2. Er sp_-præfikset stadig et nej-nej?

  3. Humaniseret eller naturlig nummersortering af blandede ord-og-tal-strenge

  4. Postgres:\copy syntaksfejl i .sql-fil