请教大家一个 sql 语句的写法

2020-10-17 12:52:56 +08:00
 Bakumon
A 表:
a_id a_name b_id_1 b_id_2
1    aName  1      2

B 表:
b_id b_name
1    bName1
2    bName2

要求查出表 A 的数据,同时使用 B 表的 b_name 代替 b_id_x

结果:
a_id a_name b_id_1 b_id_2 b_name_1 b_name_2
1    aName  1      2      bName1   bName2

这个需求该怎么写 sql 语句来查询呢,我只知道如果 a 表中只有一个 b 表的 id 时,使用左连接来做,两个就不会了

1739 次点击
所在节点    程序员
9 条回复
raymanr
2020-10-17 13:00:26 +08:00
from
a left join b b1
on a.b_id1 = b1.id
left join b b2
on a.b_id2 = b2.id

两次 left join 即可, 把这里视作有三张表来 join
ky11223344
2020-10-17 14:04:38 +08:00
select a.*, b1.b_name as b_name_1, b2.b_name as b_name2
from A a
join B b1 on a.b_id_1 = b1.b_id
join B b2 on a.b_id_2 = b2.b_id
这个可行吗?
Bakumon
2020-10-17 14:18:53 +08:00
@raymanr
@ky11223344
感谢两位大佬🙏,原来还可以做 left join
zhangysh1995
2020-10-17 14:21:57 +08:00
当 b_id 满足 unique 条件的时候,可以用 scalar function 。B 表的 b_id 加索引。

````
select A.a_id,

( select b_name as b_name_1
from B
where b_id = A.b_id_1),

( select b_name as b_name_2
from B
where b_id = A.b_id_2),

from A;
````
zhangysh1995
2020-10-17 14:23:37 +08:00
啊名称写错了,应该是 scalar query.
zhangysh1995
2020-10-17 14:26:17 +08:00
raymanr
2020-10-17 14:46:25 +08:00
@zhangysh1995 这种用法有个地方我也没太明白, 特别问一下
如果 b.id 没有索引的话, 那么假设结果有 n 行, 就会对 b 表进行 c 次全表扫描?
raymanr
2020-10-17 14:47:45 +08:00
@raymanr 最后几个字该是 n 次全表扫描, 不能修改真是忧伤
zhangysh1995
2020-10-17 15:15:57 +08:00
@raymanr 理论上不优化的情况下是滴。因为 A.b_id_x 是和某一行绑定的,所以取一行,就会扫一次 B 做查询。如果 A 有 n 行,B 有 m 行,那就是会扫 2n * m 次。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/715886

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX