Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询不在,不存在_Sql - Fatal编程技术网

SQL查询不在,不存在

SQL查询不在,不存在,sql,Sql,模式 我需要找到所有演员(stagename和realname),他们从未在一部盈利的电影中工作过(收入>预算)。找到所有的坏演员:P Movie(title, year, director, budget, earnings) Actor(stagename, realname, birthyear) ActedIn(stagename, title, year, pay) CanWorkWith(stagename, director) 这会找到其stagename未出现在第二个查询中的所

模式

我需要找到所有演员(stagename和realname),他们从未在一部盈利的电影中工作过(收入>预算)。找到所有的坏演员:P

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