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 中的 运行 示例。
我想获得每个供应商对的不同列表 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 中的 运行 示例。