SQL查询不在,不存在
模式 我需要找到所有演员(stagename和realname),他们从未在一部盈利的电影中工作过(收入>预算)。找到所有的坏演员:PSQL查询不在,不存在,sql,Sql,模式 我需要找到所有演员(stagename和realname),他们从未在一部盈利的电影中工作过(收入>预算)。找到所有的坏演员:P Movie(title, year, director, budget, earnings) Actor(stagename, realname, birthyear) ActedIn(stagename, title, year, pay) CanWorkWith(stagename, director) 这会找到其stagename未出现在第二个查询中的所
Movie(title, year, director, budget, earnings)
Actor(stagename, realname, birthyear)
ActedIn(stagename, title, year, pay)
CanWorkWith(stagename, director)
这会找到其stagename未出现在第二个查询中的所有参与者吗?第二个查询将查找所有在电影中演出并获利的舞台剧演员
这是正确的吗?是的,您在中使用
NOT的想法是正确的,但是在第二个子查询的WHERE
子句中缺少了半个布尔条件。我认为您打算使用和M.year=B.year
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))
您还可以通过几个左连接
s来完成此操作,在连接的右侧查找NULL
。这可能比子查询快
WHERE M.earnings > M.budget AND M.title = B.title AND M.year = B.year
我想你可以简化一下,如下所示:
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
这会管用的,但只需将ActedIn和Movie连接起来,而不必存在
外部连接可能比NOT IN子句更快,但您需要运行explain计划来确保 那就行了。你也可以这样写:
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)
它基本上是以盈利的电影作为左加入条件;当左连接为null时,将对其进行计数
我还添加了上述糟糕演员的总薪酬,并将他们从最佳薪酬到最差薪酬进行排名;-)
-没有子查询
-讲述了从未在电影中表演过的演员
-如果需要,可以访问聚合函数。不确定这是否重要,但“和M.Engages>M.budget”应位于左侧连接处,否则它会有效地将其转换为内部连接join@DJ. 你说得对,这里可能不重要,但我会移动它。Is LEFT JOIN=LEFT OUTER JOIN,因为我的笔记中显示了这一点
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
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