我有一个像下面的桌子
**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
我也不知道该怎么做。
答案 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
)