sql - 为什么在 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”吗?有人可以向我解释幕后究竟发生了什么吗?
解决方案
首先,您的子查询不需要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 不会重复。created
name
id
id
id
推荐阅读
- ios - 无法在我的 TableView 中显示自定义单元格文件?
- java - 处理公共/中心对象的最佳方式
- java - 如何将对象存储在另一个类中的一个类的数组列表中
- javascript - 如何防止 JavaScript 因多次单击按钮而滞后?
- swift - SWIFT Firestore 使用查询获取数据以过滤 whereField is equalTo a autoID 失败
- css - 在网格容器内保持 100vh 溢出的问题
- kubernetes - Ingress Nginx 在服务器代码段中使用正则表达式
- c# - 服务器端google授权
- ubuntu - VS Code 代码命令在 Pop OS 的终端上不再工作
- ms-access - 计算列突然生成错误,“您输入的设置对此属性无效。”