4

スキーマ

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))

これにより、2番目のクエリにステージ名が表示されないすべての俳優が見つかりますか?2番目のクエリは、利益を上げた映画で演じたすべてのステージ名を検索します。

これは正しいです?

4

5 に答える 5

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)
于 2012-06-14T01:37:36.403 に答える
0

はい、あなたはを使用するための正しい考えを持ってNOT INいますが、2番目のサブクエリのWHERE句でブール条件の半分が欠落しています。使うつもりだと思いますAND M.year = B.year

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

結合の右側LEFT JOINを探して、数秒でこれを行うこともできます。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
于 2012-06-14T01:36:13.500 に答える
0

それは機能しますが、存在するのではなく、ActedInとMovieの間で結合するだけです。

おそらく、外部結合もNOT IN句よりも高速である可能性がありますが、確実に説明プランを実行する必要があります。

于 2012-06-14T01:38:43.063 に答える
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

基本的には、利益を上げた映画を取り、それを左結合条件として使用します。左結合がnullの場合、カウントされます。

私はまた、上記の悪役の合計賃金を追加し、最高から最低の報酬までランク付けしました;-)

于 2012-06-14T01:42:28.067 に答える
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

-サブクエリはありません

-まだ映画に出演したことがない俳優のアカウント

-必要に応じて集計関数にアクセスします。

于 2012-06-14T03:05:05.503 に答える