【发布时间】: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。