SQL 中的一对值之间的唯一覆盖

Unique coverage between a pair of values in SQL

我想获得每个供应商对的不同列表 Item_IDs,例如(A,B), (A,C), (B,C) 我有一个 table 这样的:

Item_ID | vendor 
123         A 
123         B 
133         B 
456         C 

我想列出每对供应商之间 ALL 个不同的 Item_IDs,如下所示。本质上,我想知道一对供应商之间“涵盖”(或存在)的所有 Item_IDs。

Vendor1 | Vendor 2 | Item_ID
A           B         123
A           B         133 
A           C         123 
A           C         456
B           C         123
B           C         133 
B           C         456

我曾尝试使用自连接来并排获得 2 个供应商,但在如何列出每对 Item_IDs 方面苦苦挣扎。 这是我目前所拥有的:

select 
  distinct a.vendor as vendor1, b.vendor as vendor2
from table a 
join table b on a.vendor != b.vendor 
            and a.vendor >= b.vendor -- to remove duplicate combinations

以下查询在 SQL Server 2019 中有效,但我没有机会在 Azure 中对其进行测试。

你可以这样做:

with
v as (select distinct vendor as vendor from t)
select 
  a.vendor as vendor1,
  b.vendor as vendor2,
  x.item_id
from v a
join v b on b.vendor > a.vendor
cross apply (
  select distinct item_id 
  from t 
  where t.vendor = a.vendor or t.vendor = b.vendor
) x
order by a.vendor, b.vendor

结果:

 vendor1  vendor2  item_id 
 -------- -------- ------- 
 A        B        123     
 A        B        133     
 A        C        123     
 A        C        456     
 B        C        123     
 B        C        133     
 B        C        456     

请参阅 db<>fiddle 中的 运行 示例。