查找不可能的行和列组合

Posted

技术标签:

【中文标题】查找不可能的行和列组合【英文标题】:Find not possible combinations of rows & columns 【发布时间】:2021-02-17 14:19:06 【问题描述】:

基于 SQL Server,我有多行多列。每行包含一个产品配置,该配置至少在一列中不同。现在我需要知道哪些是不存在的配置。三列只是为了便于理解的示例。

数据示例:

Product Size Color
Shirt S Red
Shirt S Blue
Shirt S Black
Shirt M Red
Shirt M Blue
Shirt L Yellow

因此,这些配置丢失了:

Product Size Color
Shirt S Yellow
Shirt M Black
Shirt M Yellow
Shirt L Red
Shirt L Blue
Shirt L Black

【问题讨论】:

【参考方案1】:

您可以使用cross join 生成所有行。然后过滤掉那些存在的:

select p.product, s.size, c.color
from (select distinct product from t) p cross join
     (select distinct size from t) s cross join
     (select distinct color from t) c left join
     t
     on p.product = t.product and
        s.size = t.size and
        c.color = t.color
where t.product is null;

【讨论】:

【参考方案2】:

Gordon 的回答没有考虑可为空的列,这里有一个:

select p.product, s.size, c.color
from (select distinct product from t) p cross join
     (select distinct size from t) s cross join
     (select distinct color from t) c
except
select t.product, t.size, t.color
from t;

如果您有实际的 productsizecolor 表,则使用这些表而不是 select distinct... from t 会更高效

【讨论】:

FWIW:Gordon Linoff 的回答是得到广泛支持的标准 SQL。并非所有 DMBS 都支持EXCEPT 另外我会假设product 不能为NULL,所以它真的没有任何区别。 @Kaii 我不相信这是真的,请参阅***.com/questions/26060151/…

以上是关于查找不可能的行和列组合的主要内容,如果未能解决你的问题,请参考以下文章

在二维数组中的行和列处查找最大值

如何优化矩阵中行 x 列组合的搜索?

如何访问选择查询的行和列[关闭]

R - 删除具有相同值的行和具有相同值组合的行

SQL VS NoSQL

使用SQL获取行和列取决于值? [重复]