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

Left-Outer Tham gia vào Postgres Không trả lại giá trị cho Null

Tôi đang đưa ra câu trả lời của mình vì tôi có nghi ngờ đáng kể về các câu trả lời khác. Bạn phải cẩn thận về các yêu cầu bộ lọc. Hãy nhớ rằng, mệnh đề where chạy sau khi bạn tham gia . Vì vậy, nếu có bất kỳ yêu cầu bộ lọc nào trong mệnh đề where tham chiếu đến bảng không được nối bên ngoài, bạn đã (trong nhiều trường hợp) đã vô hiệu hóa phép nối bên ngoài của mình. Vì vậy, lấy sql của bạn, Có vẻ như giải pháp đơn giản nhất là sử dụng nối thích hợp hoặc di chuyển tên bảng một cách thích hợp, sau đó di chuyển các điều kiện lọc ra khỏi mệnh đề where và vào mệnh đề nối.

SELECT  f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount 
FROM    download_time d 
RIGHT OUTER JOIN fs_fault f ON 
    f.downloadtimeid = d.id
    AND f.faultcode IN (1000,1100)
    AND f.statusid IN(2, 4)
    AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
    AND d.bunoid = 166501
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode

Một cách khác mà tôi tin rằng nên tương đương là

SELECT  f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount 
FROM    download_time d 
RIGHT OUTER JOIN fs_fault f ON 
    f.downloadtimeid = d.id
    AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
    AND d.bunoid = 166501
WHERE
    f.faultcode IN (1000,1100)
    AND f.statusid IN(2, 4)
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode

Vì nó không hoàn toàn quan trọng các yêu cầu bộ lọc trên fs_fault ở đâu. (và công cụ SQL của bạn sẽ thay đổi tất cả điều đó).

Chỉnh sửa:Đây là SQLFiddle thể hiện việc lọc mệnh đề tham gia so với mệnh đề where.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách sao lưu và khôi phục cơ sở dữ liệu PostgreSQL qua DBeaver

  2. Các giải pháp DBaaS tốt nhất cho PostgreSQL

  3. Tìm sự khác biệt giữa các dấu thời gian tính bằng giây trong PostgreSQL bằng JOOQ

  4. Chế độ xem PostgreSQL:Tham chiếu một trường được tính toán trong một trường được tính toán khác

  5. SQL:truy vấn con có quá nhiều cột