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

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

  •  1
     
  •   wozhizui · 117 天前 · 1796 次点击
    这是一个创建于 117 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前有三张表: 描述表 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 条附言  ·  117 天前

    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 条附言  ·  117 天前
    v2ex 不支持 markdown 的吗
    21 回复  |  直到 2019-06-27 16:35:00 +08:00
        1
    tankren   117 天前
    ABAP????
        2
    jay0726   117 天前
    没明白啥意思 三张表联合查询查出两条数据,一条要有 address,一条 address 为空???
        3
    zz656565   117 天前
    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 ...
        4
    ourzhang   117 天前
    A inner join B left join C
        5
    c4f36e5766583218   117 天前
    没看懂问题。。。我假设

    表 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

    你列一下你想要查到什么样效果的结果?按我给出的样式
        6
    zzcworld   117 天前
    记住要先用 inner join 再用 left join,因为始终都是以第一章表( select from 的)为基准。inner join 的有地址,left join 的没有地址
        7
    ayumilove   117 天前
    如果是 Oracle 可以 用 rownum 实现。
        8
    ayumilove   117 天前
    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
        9
    c4f36e5766583218   117 天前
    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
        10
    muchengxue   117 天前
    相信回答的人,更喜欢你用几张 demo 表,更好回答
        11
    wozhizui   117 天前
    @tankren 这都能看出来?
        12
    wozhizui   117 天前
    @jay0726 是这个意思
        13
    wozhizui   117 天前
    @c4f36e5766583218
    no1, name1, info1, address1
    no2, name2,, info2, null
        14
    tankren   117 天前
    @wozhizui 我做 SAP 的 只懂 ABAP,哈哈哈
        15
    wozhizui   117 天前
    @ayumilove 不是 oracle,不能这么实现。
        16
    wozhizui   117 天前
    @tankren 是 abap,第二个 data 表是+data( select * from ... into zdata as b),所以只能这个顺序写。
        17
    wozhizui   117 天前
    ## 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
        18
    c4f36e5766583218   117 天前
    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
        19
    tankren   117 天前
    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
        20
    jay0726   117 天前
    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
        21
    c4f36e5766583218   117 天前
    v2ex [部分] 支持 markdown, 凑合着用吧。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4065 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 08:50 · PVG 16:50 · LAX 01:50 · JFK 04:50
    ♥ Do have faith in what you're doing.