合并来自不同表的列(SQL Server)

时间:2013-07-24 02:28:21

标签: sql-server sql-server-2008 sql-server-2005

我想将3个表合并为一个表。我正在使用SQL Server 2005.我尝试FULL OUTER JOIN但在结果中获得了重复的ID。所以非常感谢你的帮助。

+---------------+   +---------------+    +---------------+ 
| ID   COL_A    |   | ID    COL_B   |    | ID    COL_C   |
+---------------+   +---------------+    +---------------+
| a    2        |   | b     1       |    | a     1       |
| c    1        |   | c     1       |    | d     1       |
+---------------+   +---------------+    +---------------+

结果:

+---------------------------+
| ID   COL_A  COL_B  COL_C  |
+---------------------------+   
| a    2      NULL   1      | 
| b    NULL   1      NULL   |
| c    1      1      NULL   |
| d    NULL   NULL   1      |
+---------------------------+

每个表都有不同的数据行。

这是创建表格的代码:

declare @a table (
    ID      char(1),
    COL_A   int
)
declare @b table (
    ID      char(1),
    COL_B   int
)
declare @c table (
    ID      char(1),
    COL_C   int
)

insert into @a values ('a', 2)
insert into @a values ('c', 1)

insert into @b values ('b', 1)
insert into @b values ('c', 1)

insert into @c values ('a', 1)
insert into @c values ('d', 1)

select * from @a
select * from @b
select * from @c

谢谢!


@Francis Fuerte ,我的完整联接查询如下所示:

SELECT  COALESCE(c.ID,a.ID,b.ID) AS ID
       ,a.COL_A
       ,b.COL_B
       ,c.COL_C 
FROM @c c 
FULL OUTER JOIN @a a ON c.ID=a.ID
FULL OUTER JOIN @b b ON c.ID=b.ID  
ORDER BY ID

@Nithesh ,如果要加入的表的顺序发生变化,结果也会发生变化。

SELECT  ISNULL(ISNULL(a.ID,b.ID),c.ID) AS ID
       ,a.COL_A
       ,b.COL_B
       ,c.COL_C 
FROM @a a 
FULL OUTER JOIN @b b ON a.ID=b.ID  
FULL OUTER JOIN @c c ON a.ID=c.ID
ORDER BY ID

SELECT  ISNULL(ISNULL(b.ID,a.ID),c.ID) AS ID
       ,a.COL_A
       ,b.COL_B
       ,c.COL_C 
FROM @b b 
FULL OUTER JOIN @a a ON b.ID=a.ID  
FULL OUTER JOIN @c c ON b.ID=c.ID
ORDER BY ID

SELECT  ISNULL(ISNULL(c.ID,b.ID),a.ID) AS ID
       ,a.COL_A
       ,b.COL_B
       ,c.COL_C 
FROM @c c 
FULL OUTER JOIN @b b ON c.ID=b.ID  
FULL OUTER JOIN @a a ON c.ID=a.ID
ORDER BY ID

结果:(抱歉,没有足够的声誉来发布图片)

+---------------------------+
| ID   COL_A  COL_B  COL_C  |
+---------------------------+   
| a    2      NULL   1      | 
| b    NULL   1      NULL   |
| c    1      1      NULL   |
| d    NULL   NULL   1      |
+---------------------------+
+---------------------------+
| ID   COL_A  COL_B  COL_C  |
+---------------------------+   
| a    2      NULL   NULL   | 
| a    NULL   NULL   1      |
| b    NULL   1      NULL   |
| c    1      1      NULL   |
| d    NULL   NULL   1      |
+---------------------------+
+---------------------------+
| ID   COL_A  COL_B  COL_C  |
+---------------------------+   
| a    2      NULL   1      | 
| b    NULL   1      NULL   |
| c    NULL   1      NULL   |
| c    1      NULL   NULL   |
| d    NULL   NULL   1      |
+---------------------------+

我是否真的需要添加一个带有GROUPBY子句的额外图层以避免重复?

5 个答案:

答案 0 :(得分:2)

鉴于您的样本,以下内容将起作用:

SELECT ISNULL(AB.ID, C.ID) AS [ID], AB.COL_A, AB.COL_B, C.COL_C
FROM (
    SELECT ISNULL(A.ID, B.ID) AS [ID], A.COL_A, B.COL_B
    FROM @a A
    FULL OUTER JOIN @b B
        ON A.ID = B.ID
) AB
FULL OUTER JOIN @c C
    ON AB.ID = C.ID
ORDER BY ISNULL(AB.ID, C.ID)

基本上,做一个A + B的FULL OUTER JOIN,然后使用它的结果加入C。

答案 1 :(得分:0)

最简单的方法是使用union all和聚合:

select id, max(Col_A) as Col_A, max(Col_B) as Col_B, max(Col_C) as Col_c
from ((select id, col_A, NULL as col_B, NULL as COL_C
       from @a
      ) union all
      (select id, NULL, col_B, NULL
       from @b
      ) union all
      (select id, NULL, NULL, COL_C
       from @c
      )
     ) abc
group by id;

答案 2 :(得分:0)

这是一篇关于联接类型的精彩文章,有助于阅读。

http://blog.sqlauthority.com/2009/04/13/sql-server-introduction-to-joins-basic-of-joins/

假设您想保留数据来源的身份。 Col A,Col B,Col C

不确定您在回归中的期望,但从我所看到的,您应该更改为表之间的内部联接。请记住,您一次只能加入一张桌子。

答案 3 :(得分:0)

select  case when a.ID IS not null then a.ID 
        when b.ID IS not null then b.ID 
        when c.ID IS not null then c.ID 
    end id
    ,a.COL_A
    ,b.COL_B 
    ,c.COL_C
from    @a a full outer join @b b on a.ID = b.id
         full outer join @c c on a.ID = c.id
order by 1

希望这有帮助

答案 4 :(得分:0)

试试这个

SELECT  ISNULL(ISNULL(a.ID,b.ID),c.ID) AS ID
       ,a.COL_A
       ,b.COL_B
       ,c.COL_C 
FROM @a a 
FULL OUTER JOIN @b b ON a.ID=b.ID  
FULL OUTER JOIN @c c ON a.ID=c.ID
ORDER BY ID

<强>结果

enter image description here