2016-07-11 16 views
0

次の問題があります。ID T-SQLを使用して複数の単一列に結合

テーブルA:RECORD_ID、REFERENCE_ID、Paramの

テーブルB:DOC_ID、NameB

表C:DOC_ID、NameC

TableA.Paramの値に応じて、私は3つのテーブルを結合しようとしています私は制約する「ケース」を使用しようとしましたが、働いていなかった:)

REFERENCE_ID

に接合することで、テーブルBまたはCから名前を選択する必要があります

アイデア?

+0

代わりに、参加左の使用をあなたのクエリで – mcha

答えて

0

あなたはその条件とleft joinにできたとBTW coalesce()

select a.Record_id, a.Reference_id, 
     coalesce(b.NameB, c.NameC) as name 
from TableA as a 
left join TableB as b on a.Reference_id = b.Doc_id 
        and Param = 'B' 
        and b.STAT = 'A' 
left join TableC as c on a.Reference_id = c.Doc_id 
        and Param = 'C' 
        and c.STAT = 'A' 

で最初のnull以外の名前を取るあなたのクエリが近い(endを逃した)されました。これはleft join

select a.Record_id, a.Reference_id, 
     case when Param = 'B' then b.NameB 
      when Param = 'C' then c.NameC 
     end as name 
from TableA as a 
left join TableB as b on a.Reference_id = b.Doc_id and b.STAT = 'A' 
left join TableC as c on a.Reference_id = c.Doc_id and c.STAT = 'A' 
+1

その2番目のバージョンは、おそらくまた、左の結合を使用する必要があります。 – mikeagg

+0

はい、それが最後の文を追加した理由です。 –

+0

しかし、それはあまりにも誤解を招いていると思います。それを変更しました。ありがとう。 –

0

で働いているだろう、この試してみてください:あなたがサンプルデータと期待される結果を投稿することができた場合、それはまた、あなたを助けるために役立つ、

SELECT a.Record_id, a.Reference_id, b.NameB AS Name 
FROM TableA AS a 
INNER JOIN TableB AS b ON a.Reference_id = b.Doc_id 
WHERE a.Param = 'B' 

UNION 

SELECT a.Record_id, a.Reference_id, c.NameC AS Name 
FROM TableA AS a 
INNER JOIN TableC as c ON a.Reference_id = c.Doc_id 
WHERE c.Param = 'C' 
+0

ユニオンを動作させるには、NameBとNameCの名前を変更する必要がありますか? – mikeagg

+0

@mikeagg: 'union'の最初のクエリは列名を定義します。この場合、最後の列の名前は 'NameB'です。エイリアスは '... b.NameB as Name ... 'のようにはっきりしています。 –

0
SELECT a.Record_id, a.Reference_id,V.Name 
FROM TableA AS a 
inner join 
(
SELECT Doc_id id, NameB Name,'B' Type from TableB 
UNION ALL 
SELECT Doc_id ID, NameC name,'C' Type From TableC 
) AS V On V.ID=Reference_id AND Type=Param 
関連する問題