Đó là trường hợp của quan hệ-phân chia .
Đị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
;