查找与Grabbag值表不同的值

时间:2019-02-08 16:36:01

标签: sql-server

我有一个像下面的桌子

**Col1  Col2**
ABC  XYZ
ABC  A12
DEF  XYZ
DEF  A12
DEF  ADB     

在Col1中有数百个不同的值,在Col2中可以有2-50个不同的值。我需要找到Col1的一对超集,它们具有1个值,并且只有1个Col2值与另一组不同。

示例:ABC包含(XYZ,A12),DEF包含(XYZ,A12和ADB)。 因此,DEF是ABC的超集,具有ADB的单个附加值。

我需要生成一个类似于以下内容的表:

**SUPERSET  SUBSET  ADDL**
DEF  ABC  ADB

我也不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

如果您对代码进行笛卡尔乘积运算,则可以看到B是否不在A中没有成员,而A在B中没有成员,因此A将是B的超集

 SELECT DISTINCT y1.col1 Superset, y2.col1 subset  from YourTable y1, YourTable y2 WHERE
     NOT EXISTS (SELECT col2 FROM YourTable y3 WHERE y3.col1 = y2.col1 
                 EXCEPT
                 SELECT col2 FROM YourTable y4 WHERE y4.col1 = y1.col1
                )
     AND EXISTS (SELECT col2 FROM YourTable y5 WHERE y5.col1 = y1.col1 
                 EXCEPT
                 SELECT col2 FROM YourTable y6 WHERE y6.col1 = y2.col1
                )

您可以尝试检查是否只有1个其他元素 (从不在A中的B)= 0个项目,(从不在B中的A的A)= 1个项目

SELECT DISTINCT y1.col1 Superset, y2.col1 subset  from YourTable y1, YourTable y2 WHERE
     NOT EXISTS (SELECT col2 FROM YourTable y3 WHERE y3.col1 = y2.col1 
                 EXCEPT
                 SELECT col2 FROM YourTable y4 WHERE y4.col1 = y1.col1
                )
     AND   1 = (SELECT count(1) as x FROM (SELECT col2 FROM YourTable y5 WHERE y5.col1 = y1.col1 
                 EXCEPT
                 SELECT col2 FROM YourTable y6 WHERE y6.col1 = y2.col1) DQ
                )

可能还会获得附加值,

SELECT DISTINCT y1.col1 Superset, y2.col1 subset, DQ3.col2  from YourTable y1, YourTable y2 
     OUTER APPLY (SELECT TOP 1 DQ2.col2 FROM (SELECT col2 FROM YourTable y5 WHERE y5.col1 = y1.col1 
                 EXCEPT
                 SELECT col2 FROM YourTable y6 WHERE y6.col1 = y2.col1) DQ2) DQ3 
        WHERE
     NOT EXISTS (SELECT col2 FROM YourTable y3 WHERE y3.col1 = y2.col1 
                 EXCEPT
                 SELECT col2 FROM YourTable y4 WHERE y4.col1 = y1.col1
                )
     AND   1 = (SELECT count(1) as x FROM (SELECT col2 FROM YourTable y5 WHERE y5.col1 = y1.col1 
                 EXCEPT
                 SELECT col2 FROM YourTable y6 WHERE y6.col1 = y2.col1) DQ
                )