2012-06-14 93 views
4

架構SQL查詢NOT IN,EXIST

Movie(title, year, director, budget, earnings) 
Actor(stagename, realname, birthyear) 
ActedIn(stagename, title, year, pay) 
CanWorkWith(stagename, director) 

我需要找到所有從來沒有在一部電影已經實現了盈利(盈利>預算)工作的參與者(藝名和真實姓名)。因此,找到所有的壞角色:P

SELECT A.stagename, A.realname 
FROM Actor A 
WHERE A.stagename NOT IN 
    (SELECT B.stagename 
    FROM ActedIN B 
    WHERE EXIST 
     (SELECT * 
      FROM Movie M 
      WHERE M.earnings > M.budget AND M.title = B.title AND M.year)) 

這會發現所有其藝名沒有出現在第二個查詢的演員?第二個查詢將查找在獲利的電影中執行的所有階段名稱。

這是正確的嗎?

回答

0
SELECT 
    a.stagename, 
    a.realname 
FROM 
    Actor a 
LEFT JOIN 
    ActedIn b ON a.stagename = b.stagename 
LEFT JOIN 
    Movie c ON b.title = c.title 
    AND a.year = b.year 
    AND c.earnings >= c.budget 
WHERE 
    c.title IS NULL 
GROUP BY 
    a.stagename, 
    a.realname 

- 無子查詢

-Accounts對於誰從來沒有在行動者電影

- 根據需要訪問聚合功能。

0

是的,你有正確的想法使用NOT IN,但你在第二個子查詢的WHERE子句中缺少一半的布爾條件。我想你打算使用AND M.year = B.year

WHERE M.earnings > M.budget AND M.title = B.title AND M.year = B.year 

你也可以做到這一點與一些LEFT JOIN S,在聯接的右側尋找NULL。這可能比子查詢更快。

SELECT 
    A.stagename, 
    A.realname 
FROM Actor A 
    LEFT OUTER JOIN ActedIN B ON A.stagename = B.stagename 
    LEFT OUTER JOIN Movie M ON B.title = M.title AND B.year = M.year AND M.earnings > M.budget 
WHERE 
    /* NULL ActedIN.stagename indicates the actor wasn't in this movie */ 
    B.stagename IS NULL 
+0

不確定它是否重要,但是「AND M.earnings> M.budget」應該在左連接上,否則它會將其變成INNER連接 –

+0

@DJ。你是對的,這裏可能無所謂,但我會移動它。 –

+0

LEFT JOIN = LEFT OUTER JOIN導致我在筆記中顯示的內容 – George

2

我想你可以把它簡化一下,見下圖:

SELECT DISTINCT A.stagename, A.realname 
FROM Actor A 
WHERE NOT EXISTS 
    (SELECT * 
    FROM Actor B 
     , Movie M 
     , ActedIn X 
    WHERE M.Title = X.Title 
     AND X.StageName = B.StageName 
     AND M.earnings > M.budget 
     AND M.year = X.Year 
     AND A.StageName = B.StageName) 
0

,將工作,但只是做了ActedIn和電影之間存在着加入,而不是。

也許外連接可能會更快,而不是NOT IN子句,但是您需要運行解釋計劃才能確定。

0

這樣做。你也可以這樣寫:

SELECT A.stagename, A.realname, SUM(B.pay) AS totalpay 
FROM Actor A 
INNER JOIN ActedIn B ON B.stagename = A.stagename 
LEFT JOIN Movie M ON M.title = B.title AND M.year = B.year AND M.earnings > M.budget 
WHERE M.title IS NULL 
GROUP BY A.stagename, A.realname 
ORDER BY totalpay DESC 

它基本上把賺取利潤的電影用作左連接條件;當左連接爲空時,它被計數。

我還添加了不好說演員的總薪酬和排名他們最好到最差支付;-)