2017-04-18 16 views
1

必要なバージョンが不足している製品IDを見つけようとしました。どのように(左/右)2つのテーブルを結合する?

DECLARE @ProductWithVersion TABLE(ProductId int, VersionId int) 
insert into @ProductWithVersion values(1281,7),(2220,8) 

DECLARE @NecessaryVersion TABLE(VersionId int) 
insert into @NecessaryVersion values(7),(8),(9) 

は、私のようなマッピング結果を表示する: 次のクエリは、一例を示している

@NecessaryVersionからVERSIONIDは、それらのすべてを表示する必要があり、意味
ProductId  VerisonId  VersionId 
1281    7    7 
1281    null   8 
1281    null   9 
2220    null   7 
2220    8    8 
2220    null   9 

(7,8,9 )、@ProductWithVersionのVersionIdは、@ NecessaryVersionのマッピングVersionIdがない場合、nullと表示されます。

左参加するか、右の参加よりも複雑であるため、私はそれを把握することはできません...

+0

べきではありません '@NecessaryVersion 'テーブルには' ProducdId'も入っていますか? –

+0

2つの製品IDがあれば、どのような結果が得られますか? – Lamak

答えて

1

あなたがそうのようProductIdの仲介cross join必要があります。

select p.ProductId, pv.VersionId, n.VersionId 
from @NecessaryVersion n 
    cross join (select distinct ProductId from @ProductWithVersion i) as p 
    left join @ProductWithVersion pv 
    on p.ProductId = pv.ProductId 
    and n.VersionId = pv.VersionId 

rextesterデモ:http://rextester.com/VNITDI69180

リターン:

+-----------+-----------+-----------+ 
| ProductId | VersionId | VersionId | 
+-----------+-----------+-----------+ 
|  1281 | 7   |   7 | 
|  1281 | NULL  |   8 | 
|  1281 | NULL  |   9 | 
+-----------+-----------+-----------+ 

ProductIdがユニークであるテーブルがある場合は、あるソースからdistinct ProductIdを選択する代わりに、そのテーブルを使用できます。更新データ例については


、rextesterデモ:( order by付き) http://rextester.com/LVMFO44017

同じクエリが返します。

リターン:

+-----------+-----------+-----------+ 
| ProductId | VersionId | VersionId | 
+-----------+-----------+-----------+ 
|  1281 | 7   |   7 | 
|  1281 | NULL  |   8 | 
|  1281 | NULL  |   9 | 
|  2220 | NULL  |   7 | 
|  2220 | 8   |   8 | 
|  2220 | NULL  |   9 | 
+-----------+-----------+-----------+ 
+0

ありがとうございました。「注文者」について心配する必要はありません。あなたはうまくいく! – user3174976

+0

@ user3174976お手伝いします! – SqlZim

関連する問題