2017-10-11 9 views
1

を適用します。 表A:どのようにデータを使用して取得するためには、私は要件</p> <p>サンプルデータを持って参加またはクロス

ID name 
1 cat 
2 Dog 
3 Bird 

表B:

ID name 
1 aaa 
1 bbb 
2 ccc 
2 ddd 

表C:

ID name 
1 xxx 
1 yyy 
1 zzz 
2 www 

Requir ED出力:私は違うと試してみました

ID name name name 
1 cat aaa xxx 
1 cat bbb yyy 
1 cat null zzz 
2 Dog ccc www 
2 Dog ddd www 
3 Bird NULL NULL 

Select a.ID,a.name,b.name,c.name from @A a 
full join @b b 
on a.ID = b.ID 
full join @c c 
on b.ID = c.ID 

に参加するには、誰も私に続行するための最良の方法を提案することはできますか?

+0

その背後にある論理は何ですか?あなたは何を達成しようとしていますか? –

+0

出力のロジックを説明してください。また、RDBMSの行の暗黙の順序はありません。 – GurV

+0

私はここに投稿した理由のロジックを得ることができません。私は明らかにデータと出力を与えました。私は提案を尋ねた – mohan111

答えて

5

あなたは、テーブルbcためnameを増加し、それらの間でフルに参加しないの順に各id内のシーケンス番号を割り当てるために窓関数row_numberを使用することができます。最後に、左を行うaテーブルに参加:

with b1 as (
    select b.*, row_number() over (partition by id order by name) as rn 
    from b 
    ), 
c1 as (
    select c.*, row_number() over (partition by id order by name) as rn 
    from c 
    ) 
select a.*, t.b_name, t.c_name 
from a 
left join (
    select coalesce(b1.id, c1.id) as id, 
     b1.name as b_name, 
     c1.name as c_name 
    from b1 
    full join c1 on b1.id = c1.id 
     and b1.rn = c1.rn 
    ) t on a.id = t.id; 

これはidと(name列の順序で)位置に基づいて、テーブルbcに参加する必要があることを前提としています。

+0

完璧の必要性を満たす – mohan111

+0

おそらくこれが唯一の理由は、Stack Overflowを読むことはFacebookの時間を無駄にすることよりも便利です。 @ GurV、ここで使ったロジックについてもう少し説明してください。私はまた、私のプロジェクトでも同じロジックを実装する必要があります。ありがとうございます。 –

関連する問題

 関連する問題