2013-02-21 51 views
5

我很難找出解決Oracle對HAVING EVERY子句缺乏支持的方法。Oracle SQL - 是否有一個標準的HAVING EVERY解決方法?

我有兩個表,生產和影片,下面的模式:

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

其中「PID」是整數,表示發佈者ID,「中」是代表電影ID的整數,而導演是電影導演的名字。

我的目標是獲得僅由Peter Jackson或Ben Affleck執導的發佈電影的發佈者列表(通過ID)。

爲了實現這一點,我寫了下面的查詢:

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

但由於Oracle不支持不必每次,我得到的是以下錯誤:

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

因爲導演必須適用於出版商製作的每部電影,我不認爲該條件可以轉移到WHERE條款。

圍繞這個障礙有什麼辦法嗎?任何被認爲是「標準」的東西?此外(也許更重要的是)爲什麼Oracle選擇不實施HAVING EVERY?

回答

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 2013-02-21 22:01:36

+1

+1 - 我誤解了我的答案,因爲我誤解了OP的請求。很好的答案! – sgeddes 2013-02-21 22:31:09

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在盒子外面思考!只有downer纔是相關的子查詢,它在大數據集上會變得昂貴。看到我的答案。 – ninesided 2013-02-21 23:08:45

+0

+1這簡單得多! – 2013-02-21 23:13:58

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

相關問題