2012-04-10 10 views
5

मैं एक डेटाबेस पाठ्यक्रम मैं ले रहा हूँ के लिए एक पिछले कागज के ऊपर जा रहा हूँ और मैं एक एसक्यूएल प्रश्नएसक्यूएल में "अनन्य" क्वेरी कैसे लिखें?

यहाँ पर अटक कर रहा हूँ प्रदान की

  • देश (नाम, राजधानी, क्षेत्र) स्कीमा, नाम है कुंजी

  • लोग (देश, जनसंख्या, बच्चों, वयस्क) जहां देश देश में नाम का उल्लेख, जनसंख्या कुल जनसंख्या है, और बच्चों और वयस्क बच्चों और वयस्क आबादी का प्रतिशत है।

  • भाषा (देश, भाषा, प्रतिशत) - देश में बोली जाने वाली प्रत्येक भाषा के लिए, यह भाषा बोलने वाली आबादी का प्रतिशत सूचीबद्ध करती है।

    एसक्यूएल में निम्न क्वेरी लिखें: भाषाओं कि केवल जिन देशों का कुल जनसंख्या 10^7 से अधिक में बोली जाने वाली हैं खोजें

यहाँ सवाल है।

यह वही है मैं अब तक है:

SELECT l.language 
FROM people p, language l 
WHERE l.country = p.country AND 
    p.population > 10^7 

बिट मैं उलझन में हूँ के बारे में है कोई अन्य देशों जो एक भाषा में बोली जाती है देखते हैं कि जाँच करने के लिए कैसे लेकिन जनसंख्या कम है 10^7 से अधिक।

कोई सलाह? धन्यवाद

+0

चूंकि यह एक डीबी सी के लिए है हमारा, आपको उचित शामिल वाक्यविन्यास पर पढ़ना चाहिए। आप जो भी उपयोग कर रहे हैं वह पुराने/अप्रचलित (लेकिन अभी भी कार्यात्मक) नोटेशन है, और मैं इसे "आलसी वाक्यविन्यास" कहता हूं। –

+0

"एक्स से अधिक" का अर्थ है "एक्स से कम या उसके बराबर कोई नहीं" –

+0

किसी भी भाषा के लिए एक नकली चीज़ (जो मुझे लगता है कि यह प्रश्न हो रहा है) है, खुद से पूछें: इसमें कितने देश बोली जाती हैं, और उनमें से कितने देशों में> एक्स आबादी है? या आप खुद से पूछ सकते हैं: "यदि मेरे पास दो टेबल थे, तो देश की आबादी वाला एक> एक्स, दूसरा <एक्स, उन शर्तों के बारे में क्या सच होगा जो इस शर्त को पूरा करते हैं?" उम्मीद है कि उत्तर देने में मदद करता है। मुझे लगता है कि इस तरह का विचार है कि यह प्रश्न आपको आगे बढ़ाने के लिए प्रोत्साहित कर रहा है, यह देखने के लिए दिलचस्प रहें कि अन्य लोग क्या सोचते हैं। –

उत्तर

4

सभी भाषाओं को प्राप्त करें। उस सेट से जनसंख्या < = 10^7 वाले देशों में बोली जाने वाली सभी भाषाओं को हटा दें। अनुस्मारक केवल आबादी वाले देशों पर बोली जाने वाली भाषाएं होनी चाहिए> 10^7।

select language from languages 
where language not in (
    select language from languages l 
    join people p on l.country = p.country 
    where p.population <= 10^7) 

इस आधार है कि अपने डिजाइन प्रतिबंध यह है कि हर भाषा में कम से कम एक देश में बोली जाने वाली जाना चाहिए है पर काम करता है;)

+0

यह एक तरीका है, लेकिन एक तरीका है कि (मेरे सीमित अनुभव में) * शास्त्रीय/अकादमिक समाधान के रूप में नहीं पढ़ाया जाता है क्योंकि यह उप-चयन का उपयोग करता है। –

+0

"यह इस आधार पर काम करता है कि ..." - मुझे नहीं लगता कि यह एक सुरक्षित धारणा है! – onedaywhen

+1

यदि आप सबक्वायरी के बिना समाधान चाहते हैं, तो दो SELECT को गठबंधन करने के लिए MINUS का उपयोग करें। –

1
WITH T 
    AS 
    (
     SELECT l.language, 
      p.country, p.population 
     FROM people p, language l 
     WHERE l.country = p.country 
    ) 
SELECT language 
    FROM T 
EXCEPT 
SELECT language 
    FROM T 
WHERE population <= 10000000; 
वैकल्पिक रूप से

:

SELECT language 
    FROM language AS l1 
WHERE 10000000 < (SELECT MIN(p.population) 
         FROM people p, language l 
        WHERE l.country = p.country 
          AND l.language = l1.language); 
इसी

:

SELECT language 
    FROM language AS l1 
WHERE 10000000 < ALL (SELECT p.population 
          FROM people p, language l 
         WHERE l.country = p.country 
           AND l.language = l1.language); 
संबंधित मुद्दे