PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Truy vấn trong đó cột khóa ngoại có thể là NULL

Nếu "không có hàng nào cho uid" và bạn JOIN như bạn làm, bạn nhận được không có hàng kết quả là. Sử dụng LEFT [OUTER] JOIN thay vào đó:

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;

Ngoài ra, bạn cần dấu ngoặc đơn mà tôi đã thêm vì ưu tiên toán tử . (AND liên kết trước OR ).

Tôi sử dụng IS DISTINCT FROM thay vì != trong điều kiện WHERE cuối cùng vì login.access có thể là NULL , sẽ không đủ điều kiện.

Tuy nhiên, vì bạn dường như chỉ quan tâm đến các cột từ bảng u để bắt đầu, truy vấn thay thế này sẽ thanh lịch hơn:

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

Giải pháp thay thế này có thêm một lợi thế nữa là bạn luôn nhận được một hàng từ u , ngay cả khi có nhiều hàng trong u_org hoặc 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. GROUP BY trong mệnh đề UPDATE FROM

  2. Postgresql COPY CSV ERROR:dữ liệu bổ sung sau cột dự kiến ​​cuối cùng

  3. Hết thời gian chờ kết nối PostgreSQL

  4. Quy trình gọi JPA Hibernate được lưu trữ

  5. Truy vấn postgres rất chậm với current_date ::date thay vì hardcoded date