将表与不同数据组合在一起

时间:2017-03-18 10:46:11

标签: sql db2

我有两张桌子:

+--------+-----+
| name   | A   | 
+--------+-----+
|  abc   |   10|
|  def   |   17|
|  ghi   |   27|
+--------+-----+

+--------+-----+
| name   | B   | 
+--------+-----+
|  abc   |   9 |
|  def   |   55|
|  xyz   |   92|
+--------+-----+

现在我需要将这两个表组合起来,每个名称只出现一次,但它的结果是A和B.如果没有匹配的条目,则应显示零。

所以结果应该是这样的:

+--------+-----+-----+
| name   | A   | B   |  
+--------+-----+-----+
|  abc   |   10|   9 |
|  def   |   17|   55|
|  ghi   |   27|   0 |
|  xyz   |   0 |   92|
+--------+-----+-----+

稍后我可能会有一个 C 的第三个表,应该以相同的方式添加。

SQL如何?

4 个答案:

答案 0 :(得分:3)

您需要使用full outer join,这将保留不在两个表上加入的行。您可以找到here有关此内容的更多详细信息。

您的查询应如下所示

select  coalesce(t1.name, t2.name) name
        coalesce(t1.a, 0) a,
        coalesce(t2.b, 0) b
from    table1 t1
full outer join
        table2 t2
on      t1.name = t2.name

coalesce函数返回第一个参数,如果是null,则返回第二个参数,这是必需的,因为如果没有连接一行,它将被{{1}保留但是你会有outer join个。

答案 1 :(得分:0)

select names.name, a.A, b.B
from (select name from tablea
      union 
      select name from tableb) names
  left join tablea a on a.name = names.name
  left join tableb b on b.name = names.name

答案 2 :(得分:0)

试试这个:

    create table TableA(Name varchar(3),A int)
    create table TableB(Name varchar(3),B int)

    insert into TableA values('abc',10)
    insert into TableA values('def',17)
    insert into TableA values('ghi',27)

    insert into TableB values('abc',9)
    insert into TableB values('def',55)
    insert into TableB values('xyz',92)


    select ISNULL(TableA.Name,TableB.Name),ISNULL(A,0),ISNULL(B,0) from TableA
    full outer JOIN TableB ON TableA.Name=TableB.Name

如果有两个以上的表使用' coalesce()'函数而不是ISNULL

喜欢这个,如果我们添加另一个第三个表:

    create table TableC(Name varchar(3),C int)

    insert into TableC values('abc',9)
    insert into TableC values('def',55)
    insert into Tablec values('LMN',92)


    select  coalesce(t1.name, t2.name,t3.name) name,
    coalesce(t1.a, 0) a,
    coalesce(t2.b, 0) b,
    coalesce(t3.C,0) C
    from TableA t1
    full outer JOIN TableB t2 ON t1.Name=t2.Name
    full outer JOIN TableC t3 ON t1.Name=t3.Name or  t2.Name=t3.Name

答案 3 :(得分:0)

{{1}}