我试图找出缺少必要版本的产品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 。
我无法理解,因为它比左连接或右连接更复杂......
答案 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 |
+-----------+-----------+-----------+