有一个 MySQL 的表,结构是这样的:
a1 b1
a2 b2
a2 b3
其中 a-b 是 1-N 的关系。现在给定一堆 b,要求返回所有 b 对应的 a 的所有记录。一种实现方式是:
SELECT * FROM table WHERE a IN (SELECT a FROM table WHERE b IN ('b1', 'b2', 'b3'));
请教一下,有没有更高效的语句?
1
sunnyadamm Feb 5, 2020 via Android
left join
|
2
saulshao Feb 5, 2020 这个看起来没有了,left join 最后给你的变化也就是个写法上的差异,现代关系数据库优化后和你写的这个子查询基本没差异。
这个限制在于后面那个 in 里面如果是常量,可能会由于列表增加而导致 SQL 语句长度超长.... |
3
yeyu1989 Feb 5, 2020
说的不是很清楚啊
如果是一张表,用 distinct 就行 如果是两张表,用 exists 理论上更快 |
4
Codelike Feb 6, 2020
你说的应该是一张表,直接用 distinct。至于 sql 语句过长的问题,可以在 service 层进行分批处理,然后用 set 汇总。
|
5
CRVV Feb 6, 2020
楼主描述的问题和给出的 SQL 不是同一个问题
如果表里的数据是 a1 b1 a2 b2 a2 b3 a2 b4 SQL 返回的是 a1 b1 a2 b2 a2 b3 a2 b4 但是看描述应该返回 a1 a2 如果把 SQL 的开头改成 SELECT a FROM ...... 结果是 a1 a2 a2 a2 还有一种你可能想要的结果是 a1 a2 a2 还有一种你可能想要的结果是 a1 b1 a2 b2 a2 b3 所以请问楼主,你到底要哪一种结果? |