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

这会找到所有艺名未出现在第二个查询中的演员吗?第二个查询将查找所有在盈利电影中演出的艺名。

这个对吗?

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
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 回答
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

它基本上将获利的电影用作左连接条件;当左连接为空时,它会被计算在内。

我还添加了上述不良演员的总薪酬,并将他们从最高到最低的薪酬排名;-)

于 2012-06-14T01:42:28.067 回答
0

是的,您对 using 有正确的想法NOT IN,但是您在第二个子查询的WHERE子句中缺少半个布尔条件。我想你打算使用AND M.year = B.year

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

你也可以用几个 s 来做这个,在右边的 join 中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 回答