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

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

  •  
  •   Bakumon · 13 天前 · 979 次点击
    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   13 天前   ❤️ 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   13 天前   ❤️ 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   13 天前
    @raymanr
    @ky11223344
    感谢两位大佬🙏,原来还可以做 left join
    zhangysh1995
        4
    zhangysh1995   13 天前   ❤️ 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   13 天前
    啊名称写错了,应该是 scalar query.
    zhangysh1995
        6
    zhangysh1995   13 天前
    raymanr
        7
    raymanr   13 天前
    @zhangysh1995 这种用法有个地方我也没太明白, 特别问一下
    如果 b.id 没有索引的话, 那么假设结果有 n 行, 就会对 b 表进行 c 次全表扫描?
    raymanr
        8
    raymanr   13 天前
    @raymanr 最后几个字该是 n 次全表扫描, 不能修改真是忧伤
    zhangysh1995
        9
    zhangysh1995   13 天前
    @raymanr 理论上不优化的情况下是滴。因为 A.b_id_x 是和某一行绑定的,所以取一行,就会扫一次 B 做查询。如果 A 有 n 行,B 有 m 行,那就是会扫 2n * m 次。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3801 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 10:10 · PVG 18:10 · LAX 03:10 · JFK 06:10
    ♥ Do have faith in what you're doing.