MYSQL 连接中的嵌套 Select 语句

Posted

技术标签:

【中文标题】MYSQL 连接中的嵌套 Select 语句【英文标题】:Nested Select statement in MYSQL join 【发布时间】:2011-11-03 21:43:18 【问题描述】:
SELECT * FROM A
JOIN B
ON B.ID = A.ID
AND B.Time =   (SELECT max(Time) 
                            FROM B B2
                            WHERE B2.ID = B.ID)

我正在尝试在 mysql 中加入这两个表。不要注意,如果 ID 是唯一的,那么我不会尝试这样做。我浓缩了真正的解决方案来画一个简化的画面。我正在尝试在某个记录的最大日期抓取并加入表 B。此过程由 SSIS 包运行,并说 B2.ID 是未知列。我在 MSSQL 中经常做这样的事情,并且是 MYSQL 的新手。有人有什么建议或想法吗?

【问题讨论】:

【参考方案1】:

我以不同的方式执行这种类型的查询,使用排除连接而不是子查询。您想找到 B 中对于给定 ID 具有最大 Time 的行;换句话说,没有其他行具有更大的时间和相同的 ID。

SELECT A.*, B.*
FROM A JOIN B ON B.ID = A.ID
LEFT OUTER JOIN B AS B2 ON B.ID = B2.ID AND B.Time < B2.Time
WHERE B2.ID IS NULL

您还可以使用派生表,它的性能应该比使用相关子查询更好。

SELECT A.*, B.*
FROM A JOIN B ON B.ID = A.ID
JOIN (SELECT ID, MAX(Time) AS Time FROM B GROUP BY ID) AS B2
  ON (B.ID, B.Time) = (B2.ID, B2.Time)

P.S.:我添加了greatest-n-per-group 标签。 Stack Overflow 上每周都会出现这种类型的 SQL 问题,因此您可以关注该标签以查看数十个类似的问题及其答案。

【讨论】:

以上是关于MYSQL 连接中的嵌套 Select 语句的主要内容,如果未能解决你的问题,请参考以下文章

mysql中insert与select的嵌套使用解决组合字段插入问题

MySQL—— 子查询

MySQL 中的 While 循环使用连接和子查询选择数据

MySQL进阶语句

MySQL进阶语句

MySql语句中select可以嵌套么,字段的重命名可以用中文么