首页 > 解决方案 > 为什么在 where 子句中使用相关查询进行查询时结果集中没有相似的 id

问题描述

我有一个表,其中包含列 id、名字、姓氏、创建(日期)。

我有一个如下表:

ID | Forename | Surname | Created
---------------------------------
 1 | Tom      | Smith   | 2008-01-01
 1 | Tom      | Windsor | 2008-02-01
 2 | Anne     | Thorn   | 2008-01-05
 2 | Anne     | Baker   | 2008-03-01
 3 | Bill     | Sykes   | 2008-01-20

Basically, I want this to return the most recent name for each ID, so it would return:

ID | Forename | Surname | Created
---------------------------------
 1 | Tom      | Windsor | 2008-02-01
 2 | Anne     | Baker   | 2008-03-01
 3 | Bill     | Sykes   | 2008-01-20

我通过这个查询得到了想要的结果。

SELECT id, forename, surname, created
FROM name n
WHERE created = (SELECT MAX(created)
                              FROM name
                              GROUP BY id
                              HAVING id = n.id);

我得到了我想要的结果,但我不明白为什么 IDS 在结果集中没有被重复。我对相关子查询的理解是它从外部查询表中取出一行并运行内部子查询。当 id 在外部查询中重复时,它不应该重复“id”吗?有人可以向我解释幕后究竟发生了什么吗?

标签: sqlcorrelated-subquery

解决方案


首先,您的子查询不需要GROUP BY. 它更常见地写成:

SELECT n.id, n.forename, n.surname, n.created
FROM name n
WHERE n.created = (SELECT MAX(n2.created)
                   FROM name n2
                   WHERE n2.id = n.id
                  );

您应该养成限定所有列引用的习惯,尤其是当您的查询有多个表引用时。

我想你在问为什么这有效。好吧,外部查询中的每一行都针对条件进行了测试。条件是:“与表中所有行created的最大值相同”。在您的数据中,每行只有一行与该条件匹配,因此s 不会重复。creatednameididid


推荐阅读