2011-07-13 4 views
0

表AでのSQL Serverで2つのテーブルを結合する方法:一つの共通の列ではなくノー冗長データ

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 

のようになります。間違った場所で編集しているとすみませます。

@Martinご返信ありがとうございます。それは2つのテーブルに最適です。しかし、実際に私は、私はこの

;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 
のようなクエリを試してみました。2.私は

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 

ように見える結果を必要とするのは、私は別のテーブルC

id  prime_members 
--------------------- 
1  p1 
1  p2 

を持っていると言うよりも多くを結合しようとしています


その後、私はこのようになりました:

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 

A.RNには1行しかないので、RN>1が含まれていないため、C.RN=B.RNは正しい出力を示しています。ここでは3つのテーブルと数行しかないので簡単です。しかし、リアルタイムでこの問題を見つけて解決する方法。また、表Aは参照表であり、すなわち表BおよびCのIDの値は表Aに示されている。

何か助けに感謝します。おかげさまで

答えて

2

テーブルには「自然順序」はありません(私たちに表示されていない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 
関連する問題