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

Tìm các bản ghi mà sự tham gia không tồn tại

Sử dụng EXISTS biểu thức:

WHERE NOT EXISTS (
   SELECT FROM votes v  -- SELECT list can be empty
   WHERE  v.some_id = base_table.some_id
   AND    v.user_id = ?
   )

Sự khác biệt

... giữa NOT EXISTS() (Ⓔ) và NOT IN() (Ⓘ) gấp đôi:

  1. Hiệu suất

    Ⓔ nói chung là nhanh hơn. Nó ngừng xử lý truy vấn con ngay khi tìm thấy kết quả phù hợp đầu tiên. Hướng dẫn sử dụng:

    Truy vấn con thường sẽ chỉ được thực thi đủ lâu để xác định xem có ít nhất một hàng được trả về hay không, chứ không phải tất cả các cách để hoàn thành.

    Ⓘ cũng có thể được tối ưu hóa bởi trình lập kế hoạch truy vấn, nhưng ở mức độ thấp hơn vì NULL việc xử lý làm cho nó phức tạp hơn.

  2. Tính đúng đắn

    Nếu một trong các giá trị kết quả trong biểu thức truy vấn con là NULL , kết quả của Ⓘ là NULL , trong khi logic thông thường sẽ mong đợi TRUE - và Ⓔ sẽ trả về TRUE . Hướng dẫn sử dụng:

    Nếu tất cả các kết quả trên mỗi hàng là không bằng nhau hoặc bằng rỗng, với ít nhất một giá trị rỗng, thì kết quả là NOT IN là null.

Về cơ bản, (NOT) EXISTS là lựa chọn tốt hơn trong hầu hết các trường hợp.

Ví dụ

Truy vấn của bạn có thể trông giống như sau:

SELECT *
FROM   questions q
WHERE  NOT EXISTS (
    SELECT FROM votes v 
    WHERE  v.question_id = q.id
    AND    v.user_id = ?
    );

Đ ừng tham gia vào votes trong truy vấn cơ sở. Điều đó sẽ làm mất công sức.

Bên cạnh đó NOT EXISTSNOT IN có các tùy chọn cú pháp bổ sung với LEFT JOIN / IS NULLEXCEPT . Xem:

  • Chọn các hàng không có trong bảng khác


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giữ cho PostgreSQL đôi khi chọn một kế hoạch truy vấn tồi

  2. Tổng hợp kết nối cơ sở dữ liệu công nhân cần tây

  3. CHÈN SQL mà không chỉ định cột. Điều gì xảy ra?

  4. Postgresql generate_series của tháng

  5. Lỗi khi đặt n_distinction bằng biến plpgsql