如何使用带有IN的子请求编写子查询

时间:2019-07-11 00:00:11

标签: sql postgresql

我有一个带有属性(名称,出发年份)的迁移表。我想写一个查询,给出2001和2003年都迁移过的所有鹳的名字(使用带有IN的子请求),NB:不允许使用WHERE,GROUP BY,ORDER BY,LIMIT之类的子句,除非必需/强制性

SELECT migration.NAME 
FROM migration 
WHERE migration.DEPARTUREYEAR = 2001 
IN(SELECT migration.NAME 
FROM migration 
WHERE migration.DEPARTUREYEAR = 2001)

此查询给我零结果

我希望输出四个名称,但实际上我有零个名称。 但是当我将查询重写为:

SELECT migration.NAME
FROM migration
WHERE migration.DEPARTUREYEAR IN (
SELECT migration.DEPARTUREYEAR
FROM migration
WHERE migration.DEPARTUREYEAR IN (2001,2003))
GROUP BY migration.NAME
HAVING COUNT (*) = 2

获得结果,但标记为错误。

1 个答案:

答案 0 :(得分:1)

您的第一个查询输入的年份不正确。但更重要的是,它缺少IN之前的比较。所以试试这个:

SELECT m.NAME 
FROM migration m
WHERE m.DEPARTUREYEAR = 2001 AND
      m.NAME IN (SELECT m2.NAME
                 FROM migration m2
                 WHERE m2.DEPARTUREYEAR = 2003
                );

我猜您正在使用MySQL。第一个版本解释为:

WHERE (migration.DEPARTUREYEAR = 2001) IN
          (SELECT m2.NAME 
           FROM migration m2
           WHERE m2.DEPARTUREYEAR = 2001
          )

IN之前的部分是布尔值,其值为0或1。这可能与任何NAME值都不匹配。