【问题标题】:Subquery in the WHERE clause exerciseWHERE 子句练习中的子查询
【发布时间】:2019-07-11 17:14:45
【问题描述】:

我有一个带有属性(姓名、出发年份)的迁移表和一个带有属性(姓名、出生年份)的鹳表。我想编写一个查询,给出在 2002 年最年轻的鹳出生之前迁移的所有鹳的名称(使用主查询中的迁移表和 WHERE 子句的子请求中的 Stork 表)。 N.B: 不允许使用 WHERE、GROUP BY、ORDER BY、LIMIT 等子句,除非是必要/强制

Migration table
Name        DEPARTURE YEAR   
Annamarie   2001   
Felix       2002
Annamarie   2003
Felix       2004
Jonas       2001

Stork table
Name       YEAROFBIRTH
Annamarie   1998
Felix       1999
Max         2000
Jonas       2001
Christina   2002

使用 DISTINCT 运算符会得到 15 个名称的所需结果,删除 DISTINCT 运算符会得到 25 个重复的名称

SELECT DISTINCT migration.NAME
FROM migration
WHERE migration.DEPARTUREYEAR IN(SELECT stork.YEAROFBIRTH
FROM stork
WHERE stork.YEAROFBIRTH <2002)

我希望在不使用 DISTINCT 运算符的情况下获得 15 个名称

【问题讨论】:

  • 是否有使用子查询的要求?虽然该查询看起来不正确,但除非migration 本身有重复项,否则您不应该得到重复项;如果是这样,DISTINCT 真的是你唯一的选择(没有滥用 GROUP BY)。
  • 那么问题到底是什么?
  • 从您的示例中,迁移表似乎有重复的名称。您想与迁移的第一个或最后一个日期进行比较吗?如果这是一个课堂练习,我认为重点是通过子查询找到最小鹳的出生年份,而不是通过硬编码 2002。

标签: mysql sql


【解决方案1】:

只是按照期望的结果,以及您的示例对文字年份的使用;这应该就是你所需要的。

SELECT DISTINCT migration.NAME
FROM migration
WHERE migration.DEPARTUREYEAR < 2002
;

但是,如果您不想使用文字年份,则可以使用子查询来确定它,如下所示:

SELECT DISTINCT migration.NAME
FROM migration
WHERE migration.DEPARTUREYEAR < (SELECT MAX(stork.YEAROFBIRTH) FROM stork)
;

【讨论】:

    【解决方案2】:

    试试这个-

    SELECT NAME -- You can apply DISTINCT if required 
    FROM Migration
    WHERE Name IN (
        SELECT Name FROM Stork
        WHERE YEAROFBIRTH < 2002
    )
    

    【讨论】:

    • (1) 不是 MSSQL,(2) 查询只会获取 2002 年之前出生的任何迁移过的鹳,即使该鹳在 2003 年迁移。
    猜你喜欢
    • 2013-03-07
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2020-12-31
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多