PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Заявка, където колоната с външен ключ може да бъде NULL

Ако има „изобщо няма ред за uid“, и вие JOIN като вас, вие няма ред като резултат. Използвайте LEFT [OUTER] JOIN вместо това:

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;

Освен това имате нужда от скобите, които добавих, поради предимство на оператор . (AND се свързва преди OR ).

Използвам IS DISTINCT FROM вместо != в последното условие WHERE, защото отново login.access може да е NULL , което не отговаря на изискванията.

Въпреки това, тъй като изглежда, че се интересувате само от колони от таблица u като начало тази алтернативна заявка би била по-елегантна:

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

Тази алтернатива има допълнителното предимство, че винаги получавате един ред от u , дори ако има няколко реда в u_org или 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. Извличане на сериен идентификатор от групово вмъкнати редове в postgresql

  2. PostgreSQL на корпоративния възел на Corda хвърля грешки в релацията

  3. Схема на релационна база данни за източник на събития

  4. бърз произволен избор на ред в Postgres

  5. Неуспешно намиране на функцията за преобразуване от неизвестно в текст