【问题标题】:SQL - join tables on multiple columnsSQL - 在多列上连接表
【发布时间】:2020-03-03 11:35:37
【问题描述】:

我想加入几张桌子:

table1:
A     B_key    B_version    C      D
123    abc        1         ccc    11  
123    abc        2         ddd    11
456    dfg        1         rrr    22
789    vvv        1                55

table2:
A     E   F 
123   s   5 
456   r   
111   t   2

table3:
B_key   B_version   G
abc        1        aa
abc        1        bb
abc        2        aa
abc        2        cc
dfg        1        aa

所以结果应该是这样的:

A      B_key B_version       C      D    E       F    G
123    abc        1         ccc    11    s       5    aa
123    abc        1         ccc    11    s       5    bb
123    abc        2         ddd    11    s       5    aa
123    abc        2         ddd    11    s       5    cc
456    dfg        1         rrr    22    r            aa
789    vvv        1                55    

版本最高可达 8。

如果我没有 A、B_key 或 B_version - 该行是无用的。否则我需要保留我所拥有的所有信息。

实际上我还有很多专栏。

我试过了:

SELECT table1.A, table 1.B_key, table 1.B_version, table 1.C, table 1.D,
       table2.E, table2.F,
       table3.G
FROM table1
LEFT JOIN table2
     ON table1.A = table2.A
LEFT JOIN table3
     ON table1.B_key = table3.B_key AND
        table1.B_version = table3.B_version

与 FULL JOIN 相同。

结果是一样的:对于每个 B_key,只保留最高的 B_version,而其他的则消失。

如何避免丢失信息?

【问题讨论】:

  • 在发布您实际尝试过的内容之前,您的问题并不清楚!
  • 最后添加的查询已经按预期工作,并给出了预期的结果。看看this

标签: sql join multiple-columns


【解决方案1】:

您可以在表之间使用左连接,如下所示:

select t1.A, t1.B_key, t1.B_version, t1.C, t1.D, t2.E, t2.F, t3.G
  from table1 t1
  left join table2 t2 on t2.A = t1.A
  left join table3 t3 on t3.B_key = t1.B_key and t3.B_version = t1.B_version

Demo

为了也为连接条件带来不匹配值的行。

【讨论】:

    【解决方案2】:

    如果我理解正确,您想要来自table1table3 的所有b_keys 和b_versions。然后你想引入其他数据。这表明左连接

    select . . .
    from ((select B_key, B_version 
           from table1
          ) union -- on purpose to remove duplicates
          ( select B_key, B_version  
           from table3
          )
         ) bb left join
         table1 t1
         on t1.b_key = bb.b_key and
            t1.b_version = bb.b_version left join
         table2 t2
         on t2.a = t1.a left join
         table3 t3
         on t1.b_key = bb.b_key and
            t1.b_version = bb.b_version;
    

    【讨论】:

    • 我尝试按照你的建议实现,但是 abb 里面没有 A。
    • @玛莎。 . .我开始的时候就这样。我调整了答案。
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 2014-02-03
    • 2021-05-30
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    相关资源
    最近更新 更多