有一个 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 2020-02-05 12:31:50 +08:00 via Android
left join
|
2
saulshao 2020-02-05 16:02:29 +08:00 1
这个看起来没有了,left join 最后给你的变化也就是个写法上的差异,现代关系数据库优化后和你写的这个子查询基本没差异。
这个限制在于后面那个 in 里面如果是常量,可能会由于列表增加而导致 SQL 语句长度超长.... |
3
yeyu1989 2020-02-05 16:35:41 +08:00
说的不是很清楚啊
如果是一张表,用 distinct 就行 如果是两张表,用 exists 理论上更快 |
4
Codelike 2020-02-06 03:20:31 +08:00
你说的应该是一张表,直接用 distinct。至于 sql 语句过长的问题,可以在 service 层进行分批处理,然后用 set 汇总。
|
5
CRVV 2020-02-06 11:31:15 +08:00
楼主描述的问题和给出的 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 所以请问楼主,你到底要哪一种结果? |