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

Toán tử ALL trong mệnh đề WHERE trong Rails

Đó là trường hợp của .

Định nghĩa bảng thực tế (mối quan hệ chuẩn 1:n, được ẩn bởi Ruby ORM) sẽ giống như sau:

CREATE TABLE instructor_student (
   id serial PRIMARY KEY
   name ...
);

CREATE TABLE fees (
   id serial PRIMARY KEY
 , instructor_student_id integer NOT NULL REFERENCES instructor_student
 , course_type ...
 , monthly_detail date
 , UNIQUE (instructor_student_id, course_type, monthly_detail)
);

Nỗ lực của bạn với một truy vấn có hiệu quả sẽ cố gắng kiểm tra từng hàng đơn lẻ trong fees chống lại nhiều giá trị trong mảng đã cho, mà luôn luôn không thành công trong khi các phần tử của mảng không giống nhau. Một giá trị không được giống với nhiều các giá trị khác. Bạn cần một cách tiếp cận khác:

SELECT instructor_student_id
FROM   fees
WHERE  course_type = ?
AND    monthly_detail = ANY(ARRAY[?]::date[])  -- ANY, not ALL!
GROUP  BY instructor_student_id
HAVING count(*) = cardinality(ARRAY[?]::date[]);

Đây là giả định khác biệt giá trị trong mảng của bạn và các mục nhập duy nhất trong phí bảng của bạn như được thực thi bởi UNIQUE ràng buộc tôi đã thêm ở trên. Mặt khác, số lượng không đáng tin cậy và bạn phải sử dụng một truy vấn phức tạp hơn. Đây là một kho các tùy chọn:

Như bạn có thể thấy, tôi không liên quan đến bảng instructor_student ở tất cả. Trong khi tính toàn vẹn của tham chiếu được thực thi với một ràng buộc FK (giống như nó thường xảy ra), chúng tôi có thể làm việc với fees một mình để xác định instructor_student_id đủ điều kiện . Nếu bạn cần tìm nạp thêm các thuộc tính từ bảng chính, hãy làm điều đó ở bước thứ 2, chẳng hạn như:

SELECT i.*  -- or whatever you need
FROM   instructor_student i
JOIN  (
   SELECT ...  -- query from above
   ) f ON f.instructor_student_id = i.id
;


  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ới hạn kích thước / độ dài của kiểu mảng trong PostgreSQL

  2. Lỗi khóa trong câu lệnh INSERT

  3. LISTEN / NOTIFY pgconnection gặp sự cố java?

  4. Trước và sau khi kích hoạt trên cùng một sự kiện? Điền vào bảng con PostgreSQL

  5. Thiết lập chính nước ngoài với kiểu dữ liệu khác nhau