V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Bakumon
V2EX  ›  程序员

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

  •  
  •   Bakumon ·
    Bakumon · 2020-10-17 12:52:56 +08:00 · 1745 次点击
    这是一个创建于 1501 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 时,使用左连接来做,两个就不会了

    9 条回复    2020-10-17 15:15:57 +08:00
    raymanr
        1
    raymanr  
       2020-10-17 13:00:26 +08:00   ❤️ 1
    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
        2
    ky11223344  
       2020-10-17 14:04:38 +08:00   ❤️ 1
    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
        3
    Bakumon  
    OP
       2020-10-17 14:18:53 +08:00
    @raymanr
    @ky11223344
    感谢两位大佬🙏,原来还可以做 left join
    zhangysh1995
        4
    zhangysh1995  
       2020-10-17 14:21:57 +08:00   ❤️ 1
    当 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
        5
    zhangysh1995  
       2020-10-17 14:23:37 +08:00
    啊名称写错了,应该是 scalar query.
    zhangysh1995
        6
    zhangysh1995  
       2020-10-17 14:26:17 +08:00
    raymanr
        7
    raymanr  
       2020-10-17 14:46:25 +08:00
    @zhangysh1995 这种用法有个地方我也没太明白, 特别问一下
    如果 b.id 没有索引的话, 那么假设结果有 n 行, 就会对 b 表进行 c 次全表扫描?
    raymanr
        8
    raymanr  
       2020-10-17 14:47:45 +08:00
    @raymanr 最后几个字该是 n 次全表扫描, 不能修改真是忧伤
    zhangysh1995
        9
    zhangysh1995  
       2020-10-17 15:15:57 +08:00
    @raymanr 理论上不优化的情况下是滴。因为 A.b_id_x 是和某一行绑定的,所以取一行,就会扫一次 B 做查询。如果 A 有 n 行,B 有 m 行,那就是会扫 2n * m 次。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5333 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:49 · PVG 11:49 · LAX 19:49 · JFK 22:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.