sql - Filter a one-to-many query by requiring all of many meet criteria -


निम्नलिखित तालिकाओं की कल्पना करें:

टेबल बक्से बनाएं (id int, name text, ...) ;

टेबल चीसिनबॉक्स बनाना (आईडी इंट, बॉक्स_आईडी इंट, चीट एनम ('सेब,' केले, 'नारंगी');

और टेबल दिखते हैं:

 बक्से: आईडी | नाम 1 | orangesOnly 2 | orangesOnly2 3 | orangesBananas 4 | विविध चीजेंइनबॉक्स: आईडी | बॉक्स_आईडी | बात 1 | 1 | नारंगी 2 | 1 | नारंगी 3 | 2 | नारंगी 4 | 3 | नारंगी 5 | 3 | केले 6 | 4 | नारंगी 7 | 4 | सेब 8 | 4 | केला  

मैं कम से कम एक नारंगी और कुछ भी नारंगी न होने वाले बक्से का चयन कैसे करूँ?

< पी> इस पैमाने पर कैसे मानता है कि मेरे पास कई लाख बक्से हैं और संभवत: एक लाख चीज़ें बक्से में हैं?

मैं एसक्यूएल में यह सब संभव रखना चाहता हूं, इसके बजाय परिणाम सेट के प्रसंस्करण के बजाय एक स्क्रिप्ट के साथ।

मैं दोनों पोस्टग्रेज़ और माइस्क्लिल का उपयोग कर रहा हूं, इसलिए subqueries संभवत: खराब हैं, यह देखते हुए कि mysql अनुकूल नहीं है IZE subqueries (पूर्व संस्करण 6, फिर भी)।

  SELECT b। * बॉक्स से JOIN चीजेंइनबॉक्स पर टी (बी.आईड = टी.बॉक्स_आईडी) ग्रुप बाय बीआईड होविंग COUNT (डिस्टिंकट टी।)) = 1 और एसयूएम (टी.जिंग = 'ऑरेंज') & gt; 0;  

यहाँ एक और समाधान है जो ग्रुप द्वारा उपयोग नहीं करता है:

  SELECT DISTINCT b। * बॉक्स से बोनस जॉइन चीसिनब्क्सस टी 1 ऑन (बी.आईडी = T1.box_id और t1.thing = 'नारंगी') ऊपरी ओवरर्स चीजों में शामिल हों टी 2 ऑन (बी.आईड = टी 2.बॉक्स_आईड और टी 2.thing! = 'नारंगी') जहां टी 2.बॉक्स_आईडी नल है;  

हमेशा की तरह, एक क्वेरी के स्केलेबिलिटी या प्रदर्शन के बारे में निष्कर्ष लेने से पहले, वास्तविक डेटा सेट के साथ आपको इसे करने की कोशिश करनी होगी और प्रदर्शन को मापना


Comments