यह रिलेशनल-डिवीजन का मामला है ।
वास्तविक तालिका परिभाषाएं (मानक 1:n संबंध, रूबी ORM द्वारा छिपाई गई) कुछ इस तरह होगी:
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)
);
एक प्रश्न पर आपका प्रयास प्रभावी ढंग से fees
. में प्रत्येक एक पंक्ति का परीक्षण करने का प्रयास करता है दिए गए सरणी में कई मानों के विरुद्ध, जो हमेशा विफल रहता है जबकि सरणी के तत्व समान नहीं हैं। एक मान एकाधिक . के समान नहीं हो सकता अन्य मूल्य। आपको एक अलग दृष्टिकोण की आवश्यकता है:
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[]);
यह मान रहा है विशिष्ट आपकी सरणी में मान और आपकी तालिका शुल्क में अद्वितीय प्रविष्टियां जैसे UNIQUE
. द्वारा लागू किया गया बाधा मैंने ऊपर जोड़ा। अन्यथा, गणना विश्वसनीय नहीं है और आपको अधिक परिष्कृत क्वेरी का उपयोग करना होगा। यहाँ विकल्पों का एक शस्त्रागार है:
जैसा कि आप देख सकते हैं, मैंने instructor_student
तालिका को शामिल नहीं किया था बिल्कुल भी। जबकि रेफ़रेंशियल अखंडता एक FK बाधा के साथ लागू की जाती है (जैसा कि आमतौर पर होता है), हम fees
के साथ काम कर सकते हैं केवल योग्यता निर्धारित करने के लिए instructor_student_id
. यदि आपको मुख्य तालिका से अधिक विशेषताएँ प्राप्त करने की आवश्यकता है, तो इसे दूसरे चरण में करें, जैसे:
SELECT i.* -- or whatever you need
FROM instructor_student i
JOIN (
SELECT ... -- query from above
) f ON f.instructor_student_id = i.id
;