Sql server 2008 如何在sql server中使用一个公共列合并两个表,但不使用冗余数据

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 __________________

表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
___________________________
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