2013-02-21 101 views
5

मुझे ओरेकल के हर खंड में समर्थन के लिए समर्थन की कमी के आसपास एक रास्ता तय करने में परेशानी हो रही है।ओरेकल एसक्यूएल - क्या प्रत्येक मानक कामकाजी मानक है?

Production (pid, mid) 
Movie(mid, director) 

जहां 'पीआईडी', प्रकाशक आईडी का प्रतिनिधित्व पूर्णांक में है 'मध्य' एक पूर्णांक फिल्म आईडी का प्रतिनिधित्व करता है, और निर्देशक हैं:

मैं दो तालिकाओं, उत्पादन और मूवी, निम्न स्कीमा के साथ है फिल्म के निदेशक का नाम।

मेरा लक्ष्य प्रकाशकों की सूची (आईडी द्वारा) प्राप्त करना है, जिन्होंने पीटर जैक्सन या बेन एफ़लेक द्वारा निर्देशित फिल्मों को प्रकाशित किया है।

इस लक्ष्य को हासिल करने के लिए, मैं निम्न क्वेरी लिखा था:

SELECT * 
    FROM Production P, Movie M 
    WHERE P.mid = M.mid; 
    GROUP BY P.pid 
    HAVING EVERY (M.director IN ('Ben Affleck', 'Peter Jackson')); 

लेकिन चूंकि ओरेकल हर होने का समर्थन नहीं करता, सब मैं निम्न त्रुटि है:

HAVING EVERY (M.director IN ('ben affleck', 'PJ')) 
          * 
ERROR at line 5: 
ORA-00907: missing right parenthesis 

क्योंकि निर्देशक को प्रकाशक द्वारा उत्पादित हर फिल्म पर आवेदन करना पड़ता है, मुझे विश्वास नहीं है कि स्थिति को WHERE खंड में स्थानांतरित किया जा सकता है।

क्या इस रोडब्लॉक के आसपास कोई रास्ता है? कुछ भी जिसे "मानक" माना जाता है? इसके अलावा (और शायद अधिक महत्वपूर्ण बात) ओरेकल ने हर जगह क्यों लागू नहीं किया है?

उत्तर

4

इस प्रयास करें:

SELECT P.pid 
FROM (select distinct Pi.pid, M.Director 
     from Production Pi INNER JOIN 
    Movie M ON Pi.mid = M.mid) P 
GROUP BY P.pid 
HAVING sum(case when P.Director in ('Ben Affleck', 'Peter Jackson') 
      then 1 else 99 end) = 2 

Here is a sqlfiddle demo

+1

चाल करने के लिए लगता है कि! बहुत - बहुत धन्यवाद। जबकि हम यहां हैं, क्या आप जानते हैं कि ओरेकल ने हर जगह क्यों लागू नहीं किया है? मुझे लगता है कि वर्कअराउंड कोड बहुत हैकी/पढ़ने के लिए मुश्किल है, जो मेरे लिए एक बहुत ही नकारात्मक पहलू है। – Dan

+1

+1 - मैंने अपना जवाब हटा दिया क्योंकि मैंने ओपी अनुरोध को गलत समझा। अच्छा उत्तर! बॉक्स के बाहर सोचने के लिए – sgeddes

3

थोड़ी देर के लिए इस बारे में सोच करने के बाद, मैं कुछ शायद की तुलना में क्या ABCade के साथ आया एक छोटे से अधिक पठनीय है कि ले कर आए हैं:

select distinct P.pid 
    from Production P 
    where P.pid not in (
     -- Get publishers that have produced a movie directed by someone else 
     select P1.pid 
     from Production P1 INNER JOIN Movie M ON P1.mid = M.mid 
     where M.director not in ('Ben Affleck', 'Peter Jackson') 
    ) 

SQLFiddle demo

टी वह अंतर यह है कि, केवल वांछित निदेशकों के साथ उत्पादकों की तलाश करने के बजाय, हम अन्य निदेशकों से जुड़े सभी उत्पादकों की पहचान करते हैं और फिर उन्हें छोड़ देते हैं।

+0

+1! केवल डाउनर सहसंबंधित सबक्वायरी है जो बड़े डेटासेट पर महंगा होगा। मेरा जवाब देखें – ninesided

+0

+1 यह बहुत आसान है! –

2

आधार पर Dan's own answer, लेकिन मैं सहसंबद्ध सबक्वेरी हटा दिया है, के रूप में यह संभावना बड़े डेटासेट पर बहुत खराब प्रदर्शन करेंगे:

SELECT DISTINCT P.pid 
FROM Production P 
LEFT JOIN (
    SELECT P1.pid 
    FROM Production P1 
    INNER JOIN Movie M ON (P1.mid = M.mid) 
    WHERE M.director NOT IN ('Ben Affleck', 'Peter Jackson') 
) V ON (P.pid = V.pid) 
WHERE v.pid IS NULL; 

SQL Fiddle demo