Sql server 2008 如何在sql server中使用一个公共列合并两个表,但不使用冗余数据
表A:Sql server 2008 如何在sql server中使用一个公共列合并两个表,但不使用冗余数据,sql-server-2008,Sql Server 2008,表A: id members ____________ 1 a 2 b 3 c 4 c 4 d 5 e 表B id countries _____________ 1 us 1 europe 1 australia 3 india 3 china 4 australia 4 canada 5 mexico 结果应该是这样的 id members countries __________________
id members
____________
1 a
2 b
3 c
4 c
4 d
5 e
表B
id countries
_____________
1 us
1 europe
1 australia
3 india
3 china
4 australia
4 canada
5 mexico
结果应该是这样的
id members countries
___________________________
1 a us
1 europe
1 australia
2 b
3 c india
3 china
4 c australia
4 d cananda
5 e mexico
如果我在错误的地方编辑,我很抱歉
@马丁:谢谢你的回复。它适用于2张桌子。但事实上,我正在尝试组合2个以上的。假设我还有一张C表
id prime_members
---------------------
1 p1
1 p2
我需要结果看起来像
id members countries prime_mem
___________________________________________
1 a us p1
1 europe p2
1 australia
2 b
3 c india
3 china
4 c australia
4 d cananda
5 e mexico
所以我试着这样问
;WITH A AS
( SELECT id, members,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY members) AS RN FROM @A ),
B AS
( SELECT id, countries,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY countries) AS RN FROM @B ),
C AS
( SELECT id,PRIME_MEM,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY PRIME_MEM) AS RN FROM @C )
SELECT COALESCE(A.id,B.id,C.ID) AS id, A.members, B.countries,C.PRIME_MEM
FROM A FULL OUTER JOIN B on A.id = B.id AND A.RN=B.RN
FULL OUTER JOIN C ON A.ID =C.ID AND C.RN = A.RN
然后我得到了这样的结果:
id members countries prime_mem
___________________________________________
1 a us p1
1 europe
1 australia
1 p2
2 b
3 c india
3 china
4 c australia
4 d cananda
5 mexico
我发现C.RN=B.RN
给出了正确的输出,因为A.RN没有RN>1,因为它只有1行。这里很简单,因为只有3个表和很少的行。但如何实时地找出并解决这个问题。表A也是一个参考表,即表B和C中的ID值将出现在表A中
感谢您的帮助。
谢谢。表没有“自然顺序”,因此(除非您没有向我们显示id之类的附加列),没有什么可以用来确保您在示例源数据中的顺序将保留在最终输出中
;WITH A AS
(
SELECT id,
members,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY members) AS RN
FROM tableA
),
B AS
(
SELECT id,
countries,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY countries) AS RN
FROM tableB
)
SELECT COALESCE(A.id,B.id) AS id,
A.members,
B.countries
FROM A FULL OUTER JOIN B on A.id = B.id AND A.RN=B.RN
返回(注意,中国和印度在每组中按字母顺序交换了位置)
id members countries
----------- ------- ---------
1 a australia
1 NULL europe
1 NULL us
2 b NULL
3 c china
3 NULL india
4 c australia
4 d canada
5 NULL mexico