V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wozhizui
V2EX  ›  问与答

SQL 的 join 搞不明白了,求解释

  •  1
     
  •   wozhizui · 2019-06-27 09:29:12 +08:00 · 3250 次点击
    这是一个创建于 2010 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前有三张表: 描述表 A(no,name1)[上万],业务数据表 B(no,...,info,)[共两记录条],描述表 C(no,address)[一条]。

    select a~no, 
    from A
    inner join B
    on A~no = b~no
    inner(or left or right) join C
    on B~no = C~no
    where ...
    into ...
    

    目前想达到的效果是两条记录,都有 name1,一条记录有 adress,一条没有 address。 因为是二次开发,表结构是不可更改的。

    第 1 条附言  ·  2019-06-27 16:13:17 +08:00

    demo表

    1. A表-描述表

    no | name ---|--- 1 | 小李 2 | 小王 ... | ... 10000 | 小王

    2. B表-业务数据表

    no | info1 | info2 ---|---|--- 1 | info1 | info2 2 | info1 | info2

    3. C表-描述表2

    no | adress ---|--- 1 | 云南

    result表

    no | info1 | info2 | name | adress ---|---|---|---|--- 1 | info1 | info2 | 小李 | 云南 2 | info1 | info2 | 小王 | null

    第 2 条附言  ·  2019-06-27 16:16:31 +08:00
    v2ex 不支持 markdown 的吗
    21 条回复    2019-06-27 16:35:00 +08:00
    tankren
        1
    tankren  
       2019-06-27 10:04:40 +08:00
    ABAP????
    jay0726
        2
    jay0726  
       2019-06-27 10:12:42 +08:00
    没明白啥意思 三张表联合查询查出两条数据,一条要有 address,一条 address 为空???
    zz656565
        3
    zz656565  
       2019-06-27 10:17:18 +08:00
    select A.no,A.name1,C.address
    from A
    inner join B
    on A.no = B.no
    left join C
    on A.no = C.no
    where ...
    into ...
    ourzhang
        4
    ourzhang  
       2019-06-27 10:21:00 +08:00
    A inner join B left join C
    c4f36e5766583218
        5
    c4f36e5766583218  
       2019-06-27 10:21:50 +08:00
    没看懂问题。。。我假设

    表 A 里有数据
    A.no1, A.name1
    A.no2, A.name2
    ...
    A.no3, A.name3
    表 B 里有数据
    B.no1, B.info1
    B.no2, B.info2
    表 C 里有数据
    C.no1, C.address1
    上面的各表的 no1=no1, no2=no2

    比如 select * from A right join B on A.no=B.no left join C on B.no=C.no; 查出来如下
    no1, name1, no1, info1, no1, address1
    null, null, no2, info2, null, null

    你列一下你想要查到什么样效果的结果?按我给出的样式
    zzcworld
        6
    zzcworld  
       2019-06-27 10:36:55 +08:00
    记住要先用 inner join 再用 left join,因为始终都是以第一章表( select from 的)为基准。inner join 的有地址,left join 的没有地址
    ayumilove
        7
    ayumilove  
       2019-06-27 10:37:20 +08:00
    如果是 Oracle 可以 用 rownum 实现。
    ayumilove
        8
    ayumilove  
       2019-06-27 10:58:03 +08:00
    select
    a.no,
    c.address
    from (select
    rownum ron,
    no
    from b
    where no ='XXXXXXX'
    order by no) b
    left join c
    on a.no = c.no
    and a.ron=1;

    查询结果 为
    no address
    XXXXXXX 中国
    XXXXXXX
    c4f36e5766583218
        9
    c4f36e5766583218  
       2019-06-27 13:21:25 +08:00
    https://www.v2ex.com/t/577872?p=1#r_7543598 写错了 fix
    比如 select * from A join B on A. no=B. no left join C on B. no=C. no; 查出来如下
    no1, name1, no1, info1, no1, address1
    no2, name2, no2, info2, null, null
    muchengxue
        10
    muchengxue  
       2019-06-27 14:59:07 +08:00
    相信回答的人,更喜欢你用几张 demo 表,更好回答
    wozhizui
        11
    wozhizui  
    OP
       2019-06-27 15:53:57 +08:00
    @tankren 这都能看出来?
    wozhizui
        12
    wozhizui  
    OP
       2019-06-27 15:54:14 +08:00
    @jay0726 是这个意思
    wozhizui
        13
    wozhizui  
    OP
       2019-06-27 15:56:18 +08:00
    @c4f36e5766583218
    no1, name1, info1, address1
    no2, name2,, info2, null
    tankren
        14
    tankren  
       2019-06-27 15:58:12 +08:00
    @wozhizui 我做 SAP 的 只懂 ABAP,哈哈哈
    wozhizui
        15
    wozhizui  
    OP
       2019-06-27 15:58:47 +08:00
    @ayumilove 不是 oracle,不能这么实现。
    wozhizui
        16
    wozhizui  
    OP
       2019-06-27 15:59:59 +08:00
    @tankren 是 abap,第二个 data 表是+data( select * from ... into zdata as b),所以只能这个顺序写。
    wozhizui
        17
    wozhizui  
    OP
       2019-06-27 16:14:50 +08:00
    ## demo 表
    #### 1. A 表-描述表

    no | name
    ---|---
    1 | 小李
    2 | 小王
    ... | ...
    10000 | 小王

    #### 2. B 表-业务数据表

    no | info1 | info2
    ---|---|---
    1 | info1 | info2
    2 | info1 | info2

    #### 3. C 表-描述表 2
    no | adress
    ---|---
    1 | 云南

    #### result 表
    no | info1 | info2 | name | adress
    ---|---|---|---|---
    1 | info1 | info2 | 小李 | 云南
    2 | info1 | info2 | 小王 | null
    c4f36e5766583218
        18
    c4f36e5766583218  
       2019-06-27 16:27:26 +08:00
    https://www.v2ex.com/t/577872?p=1#r_7545691
    那不就是最简单的多表查询问题。有什么疑问吗?
    select A. no , B. info1, B. info2, A. name , C. address from A join B on A. no=B. no left join C on B. no=C. no
    tankren
        19
    tankren  
       2019-06-27 16:29:59 +08:00
    select a~no b~info1 b~info2 a~name c~address
    from zxxx1 as a
    inner join zxxx2 as b
    on b~no = a~no
    inner join zxxx3 as c
    on c~no = a~no
    into itab1
    for all entries in xxxx
    where xxxxx
    jay0726
        20
    jay0726  
       2019-06-27 16:31:13 +08:00
    select
    a.no,
    b.info1,
    b.info2,
    a.name,
    c.address
    from a
    inner join b
    on a.no = b.no
    left join c
    on c.no = a.no
    c4f36e5766583218
        21
    c4f36e5766583218  
       2019-06-27 16:35:00 +08:00
    v2ex [部分] 支持 markdown, 凑合着用吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2814 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:59 · PVG 21:59 · LAX 05:59 · JFK 08:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.