PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zapytanie, gdzie kolumna klucza obcego może mieć wartość NULL

Jeśli nie ma żadnego wiersza dla identyfikatora UID, a ty JOIN tak jak ty, brak wiersza w wyniku. Użyj LEFT [OUTER] JOIN zamiast tego:

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;

Potrzebujesz również nawiasu, który dodałem, ponieważ pierwszeństwo operatora . (AND wiąże przed OR ).

Używam IS DISTINCT FROM zamiast != w ostatnim warunku WHERE, ponieważ ponownie login.access może być NULL , co nie kwalifikuje się.

Jednakże, ponieważ wydaje Ci się, że interesują Cię tylko kolumny z tabeli u na początek to alternatywne zapytanie byłoby bardziej eleganckie:

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

Ta alternatywa ma tę dodatkową zaletę, że zawsze otrzymujesz jeden wiersz z u , nawet jeśli istnieje wiele wierszy w u_org lub login .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak znaleźć zduplikowane rekordy w PostgreSQL

  2. PostgreSQL SHOW TABLES Odpowiednik (psql)

  3. Gdzie jest plik konfiguracyjny Postgresql:„postgresql.conf” w systemie Windows?

  4. Wykonuję n nie. procesów, gdzie n może wynosić od 5 do 50. Każdy proces wykonuje wiele operacji dml na postgres

  5. Połącz aplikację na iPhone'a z PostgreSQL za pomocą Libpq