如何(左/右)加入两个表?

时间:2017-04-18 19:07:17

标签: sql-server join

我试图找出缺少必要版本的产品ID。 以下查询显示示例:

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)

我想显示映射结果,如:

ProductId       VerisonId       VersionId
 1281               7               7
 1281               null            8
 1281               null            9
 2220               null            7
 2220               8               8
 2220               null            9

这意味着,来自@NecessaryVersion的VersionId应该显示所有这些(7,8,9),如果没有@NecessaryVersion的映射VersionId,来自@ProductWithVersion的VersionId将显示 null

我无法理解,因为它比左连接或右连接更复杂......

1 个答案:

答案 0 :(得分:1)

您需要cross join的中间人ProductId,如此:

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演示:http://rextester.com/LVMFO44017

相同的查询(带有order by)返回:

返回:

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