सेट के संदर्भ में सोचें, पुनरावृत्तियाँ नहीं; sql स्टेटमेंट वांछित आउटपुट सेट (उर्फ टेबल / रिलेशन) के गुणों को परिभाषित करता है
सभी प्रकार के नाम जैसे कि प्रत्येक बैंडकाउंट्री के लिए उस देश का एक बैंड है जो उस नाम के स्थान पर खेलता है
इसका परिणाम (यदि मैं आपके इरादों को सही ढंग से समझ गया!) उन स्थानों का समूह होगा, जिनके पास उस स्थान पर कम से कम एक बैंड है। BandCountry पर चलना अनावश्यक है, क्योंकि PLAYS संबंध में पहले से ही आपके द्वारा मांगी गई जानकारी है, आपको केवल डुप्लिकेट को समाप्त करना है
तो SQL में यह होगा:
select
distinct venueName
from PLAYS
संपादित करें: ठीक है, इसलिए वास्तविक सेट वांछित थोड़ा अधिक जटिल है। डेटाबेस से पूछा जा रहा सवाल यह है: सभी देशों से किन स्थानों पर बैंड की मेजबानी की गई है?
इसलिए, हम लक्ष्य के रूप में वांछित सेट के एक तत्व के लिए सदस्यता मानदंड को परिभाषित करते हैं, फिर सेट को आबाद करने के लिए पीछे की ओर काम करते हैं। एक स्थान आउटपुट सेट का एक सदस्य है यदि इसमें हर देश से कम से कम एक बैंड के लिए PLAYS पंक्ति है। हमें यह जानकारी कैसे मिली?
एक तरीका यह है कि प्रत्येक स्थान के लिए अलग-अलग देशों की गणना की जाए और इसकी तुलना सभी देशों की गिनती से की जाए। लेकिन हमारा कोई संबंध नहीं है। यदि हम एक पल के लिए दिए गए मॉडल के बारे में सोचते हैं, तो हम देखते हैं कि सभी देशों का सेट सही मानदंड नहीं है; यह उन सभी देशों का समूह है जिनके पास कम से कम एक बैंड है। इसलिए हमें एक देश तालिका की आवश्यकता नहीं है (हालांकि एक सामान्य मॉडल के लिए हमें एक होना चाहिए), और हमें स्थल के देश के बारे में परवाह नहीं है, हम सिर्फ उन देशों की गिनती कर सकते हैं जिनके पास बैंड हैं, जैसे (एमएस-एसक्यूएल में) )
declare @BandCountryCount int
select
@BandCountryCount = COUNT(distinct bandCountry)
from BAND
हम प्रत्येक स्थल के लिए बैंड देशों की गिनती कर सकते हैं
select
P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
from PLAYS P
inner join BAND B on B.bandName = P.bandName
और हम एक सबक्वेरी का उपयोग करके दोनों को एक साथ जोड़ सकते हैं
select
venueName
from (
select
P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
from PLAYS P
inner join BAND B on B.bandName = P.bandName
) X
where X.VenueBandCountryCount = @BandCountryCount
अब, यह सबसे सुंदर क्वेरी संभव नहीं है (ग्रुप बाय और हैविंग को टेम्प चर और एक उपश्रेणी की तुलना में अधिक 'सुरुचिपूर्ण' समाधान माना जा सकता है) लेकिन यह स्पष्ट है कि हम ओपी के उद्देश्य के लिए इसे छोड़ देंगे। ।
ओपी का उद्देश्य यह सीखना था कि मानसिकता को अनिवार्य से घोषणात्मक में कैसे स्थानांतरित किया जाए। उस अंत तक, देखें कि वर्णित अनिवार्य समाधान क्या कर रहा था:
प्रत्येक स्थल के लिए नाम बदलें सभी बैंडकंट्री पर और प्रत्येक बैंडकाउंट्री के लिए उस बैंड की सूची प्राप्त करें जो इससे आता है। यदि उनमें से कोई भी स्थलनाम में नहीं चलता है, तो अगले स्थलनाम पर जाएं। Else, bandCountries के अंत में, अच्छे स्थल के नाम के लिए स्थलनाम जोड़ें
उपरोक्त में निर्धारित मानदंड क्या है? मुझे लगता है ऐसा है:
... अगर उनमें से कोई नहीं [किसी विशेष देश से बैंड का सेट] स्थलनाम में खेलते हैं ...
यह एक अयोग्य मानदंड है । अनिवार्य विचार प्रक्रिया एक पूर्ण बाल्टी के साथ शुरू हो रही है और उन चीजों को बाहर फेंक रही है जो मानदंडों को फिट नहीं करते हैं। हम डेटा फ़िल्टर कर रहे हैं ।
यह साधारण सामान के लिए ठीक है, लेकिन यह वांछित परिणाम सेट के निर्माण के संदर्भ में सोचने में मदद करता है; संबंधित योग्यता मानदंड क्या है जो एक को बकेट भरने के लिए अनुमति देगा?
- डिसक्वालिफ़ायर: अगर किसी बैंडकंट्री से कोई बैंड नहीं निकलता है, जो किसी स्थान पर बजता है, तो स्थल अयोग्य हो जाता है
- (आंशिक) क्वालीफायर: अगर किसी बैंडकंट्री से कम से कम एक बैंड एक स्थान पर खेलता है, तो स्थल ठीक हो सकता है; बाकी बैंड कॉन्ट्रीज को चेक करते रहें
- (पूर्ण) क्वालीफायर: यदि प्रत्येक बैंड कम से कम एक बैंड एक समारोह स्थल पर खेलता है, तो वह स्थान योग्य है
अंतिम क्वालीफायर को काउंट्स का उपयोग करके सरल बनाया जा सकता है: यदि एक स्थल पर कम से कम एक बैंड बजता है तो एक बैंडकंट्री 'संतुष्ट' है; किसी स्थान के लिए 'संतुष्ट' बैंड देशों की संख्या योग्य होने के लिए बैंड देशों की संख्या के बराबर होनी चाहिए।
अब हम नेविगेशन द्वारा संबंधों के संबंध में तर्क कर सकते हैं:
- VENUE संबंध के साथ शुरू करें [हमें उत्तर के लिए इसकी आवश्यकता नहीं है, लेकिन यह संबंधपरक नेविगेशन के लिए वैचारिक प्रारंभिक बिंदु है]
- प्लेननाम में PLAYS में शामिल हों
- बैंडनमी पर बैंड बैंड में शामिल होने के लिए बैंडकाउंट्री में शामिल हों
- हम बैंड के नाम की परवाह नहीं करते; केवल स्थलनाम और बैंडकाउंट्री का चयन करें
- हम निरर्थक बैंडकाउंट्री की परवाह नहीं करते हैं; DISTRICT या GROUP BY का उपयोग करके डुप्लिकेट को समाप्त करें
- हम केवल अलग-अलग बैंडकाउंट्स की गिनती की परवाह करते हैं, न कि नामों की
- हम केवल वे स्थान चाहते हैं, जहाँ अलग-अलग बैंडकाउंट्स की गिनती बैंडकाउंट्स की कुल संख्या के समान हो
जो ऊपर दिए गए समाधान पर वापस जाता है (या उसके बाद एक उचित प्रतिकृति)
सारांश
- समुच्चय सिद्धान्त
- संबंधपरक नेविगेशन पथ
- समावेशी बनाम अनन्य मानदंड (अर्हता बनाम अयोग्य घोषित करना)