我想将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子句的额外图层以避免重复?
答案 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
<强>结果强>