我的嵌套子查询有什么问题?

时间:2014-04-14 13:28:17

标签: mysql sql subquery

所以我正在解决互动教程http://www.sqlzoo.net/wiki/SELECT_from_Nobel_Tutorial 然而奖金部分没有解决方案。

以下是问题: 在哪些年份获得了物理奖,但没有获得化学奖。

SELECT yr FROM nobel
WHERE subject = 'Physics' AND yr NOT IN
(SELECT yr FROM nobel WHERE subject = 'Literature')

我得到了输出

1943
1935
1918
1914

当教程说答案是

1933
1924
1919
1917

我不明白为什么我的解决方案是错误的

编辑:我看到了'文学'应该是化学'但它似乎仍然无效

4 个答案:

答案 0 :(得分:1)

  

在哪些年份获得了物理奖,但没有获得化学奖。

:)再次阅读你的任务......

  

WHERE subject ='Physics'和yr NOT IN   (选择来自诺贝尔奖的主题='文学')

答案 1 :(得分:1)

您的查询中有两个错误:

  • 您错误输入了Chemistry(您的查询改为Literature
  • 您没有要求distinct结果

以下是您修改过的查询:

SELECT DISTINCT yr
FROM nobel
WHERE subject = 'Physics' AND yr NOT IN
(SELECT yr FROM nobel WHERE subject = 'Chemistry')

DISTINCT很重要,因为在1933年,物理奖授予了多位获奖者 - 即狄拉克和薛定谔。表中的这两行在输出中产生两个1933条目,这是您不想要的。

答案 2 :(得分:1)

我想注意那个"警告"关于这个问题是不正确的。您可以使用group byhaving子句执行此操作:

select n.yr
from nobel n
group by n.yr
having sum(n.subject = 'Physics' ) > 0 and
       sum(n.subject = 'Chemistry' ) = 0;

我猜这时,教程还没有引入group byhaving,或者使用布尔结果作为整数。但是,您不需要join或子查询来执行此操作。

答案 3 :(得分:1)

SELECT DISTINCT x.yr 
  FROM nobel x
  LEFT
  JOIN nobel y 
    ON y.yr = x.yr
   AND y.subject = 'chemistry'
 WHERE x.subject = 'physics'
   AND y.yr IS NULL;