1

こんにちは、以下のようなテーブルがあります...

A (id,name) B(id,name) c(id,name)

ここで、クロス積テーブルがないように、各テーブルの名前を取得したいと思います。つまり、行の合計数が最大行テーブルを超えないようにします。データが以下の場合のexp

  テーブル A の場合
ID名
1ディリップ
2 アミット
3 ピユシュ
4 サミット

テーブル B の場合
ID名
1ディリップ
4 サミット

表 C の場合
ID名
2 アミット
3 ピユシュ

次に、出力は次のようになります

ノード名_A ノード名_B ノード名_C
ディリップ ディリップ NULL
アミット NULL アミット
ピユシュ NULL ピユシュ
サミット NULL

このテーブルには、id とノードのすべてのエントリが含まれるベース テーブルがありますが、他のテーブルにはエントリの数が少ないか、重複したエントリが含まれている場合があります。

どうすればいいのか教えてください

4

3 に答える 3

0

ピボットトリックはどうですか?

ただ異なる解決策..

完全な外部結合ソリューションの方が読みやすいと思います

とりあえず..

各行のすべての列に同じ名前が本当に必要な場合、または存在しない場合はnull

あなたはこのようなことをするべきです

select * 
from(   select name as row
                      ,'Table A' as [table]
                      ,name
                 from [table A]

                union all              
                select name as row
                     ,'Table B' as [table]
                     ,name
                from [Table B]      

               union all 
               select name as row
                    ,'Table C' as [table]
                    ,name
               from [Table C]       
)V
PIVOT(max(v.name) for [table] in ([Table A],[Table B],[Table C]))P
order by row

結果セットは次のようになります

Table A        Table B       Table C
Dilip           Dilip          NULL
Amit            NULL           Amit
Piyush          NULL           Piyush
Sumit           Sumit          NULL

各テーブルの名前のリストが必要な場合は、

その等しい名前は同じ行にある必要はありません..このようなことをする必要があります

select * 
from(   select ROW_NUMBER() over (order by name) as row
                      ,'Table A' as [table]
                      ,name
                 from [table A]

                union all              
                select ROW_NUMBER() over (order by name) as row
                     ,'Table B' as [table]
                     ,name
                from [Table B]      

               union all 
               select ROW_NUMBER() over (order by name) as row
                    ,'Table C' as [table]
                    ,name
               from [Table C]       
)V
PIVOT(max(v.name) for [table] in ([Table A],[Table B],[Table C]))P
order by row

結果セットは次のようになります

Table A        Table B       Table C
Amit            Dilip          Amit
Dilip           Sumit          Piyush
Piyush          NULL           NULL
Sumit           NULL           NULL
于 2013-01-31T15:10:49.383 に答える
0

結合で使用FULL JOINします。COALESCE

select nodename_A = A.name
  , nodename_B = B.name
  , nodename_C = C.name
from A
  full join B on A.id = B.id
  full join C on coalesce(A.id, B.id) = C.id
order by coalesce (A.id, B.id, C.id)

ここで実行されているコードの例を見ることができます:

デモ付きのSQLフィドル

OK、私が今想定している新しいコメントに基づいて:

  1. 表Aには、すべての名前レコードが含まれます。
  2. 他のテーブルに重複が存在する可能性があります。

この新しいクエリは、上記のシナリオで機能します。

select nodename_A = A.name
  , nodenameB = case when exists (select 1 from B where A.id = B.id) then A.name end
  , nodenameC = case when exists (select 1 from C where A.id = C.id) then A.name end
from A

新しいSQLFiddleデモ、データに重複があります。

うまくいけば、これは今あなたのために働く。

于 2013-01-31T12:40:59.767 に答える
0

いくつかの外部結合でそれを行う必要があると思います:

Select a.name as aName, b.name as bName, c.name as cName
From A
LEFT join B on a.id = b.id
LEFT join C on a.id = c.id
于 2013-01-31T12:44:17.867 に答える