如果我通过数据解释,可能会更好:)
说我有一张桌子
ItemId Identifier1 Identifier2
1 'Test 1' NULL
1 'Test 2' NULL
所以ItemId 1
由'测试1'和'测试2'识别。这可以是Identifer1或Identifier 2的组合,例如
ItemId Identifier1 Identifier2
1 'Test 1' NULL
1 NULL 1
在这种情况下,ItemId 1
由'Test 1'和数字1标识。而Item可以有尽可能多的行来识别。
我想查找具有重复标识符的所有记录(在具有相同结构的表中)。
我当前的错误方法只用一行验证,所以
ItemId Identifier1 Identifier2
1 'Test 1' NULL
1 'Test 2' NULL
和
ItemId Identifier1 Identifier2
2 'Test 1' NULL
2 'Test 3' NULL
由于“测试1”匹配,将作为重复记录返回。这是不正确的。它需要检查所有行。
我想过使用'ALL',但这没有帮助!我想我需要使用聚合/窗口函数的一些魔法,但我无法提出正确的查询。
请帮忙!
答案 0 :(得分:1)
您想要查找项目的所有行与另一个项目的完全相同的行匹配的所有项目。
这更复杂,因为您有两列标识每一行,每个NULL
都很重要。但不是太复杂:
SELECT t1.itemid, t2.itemid
FROM (SELECT t.*, COUNT(*) OVER (PARTITION BY itemid) AS cnt
FROM table t
) t1 FULL OUTER JOIN
(SELECT t.*, COUNT(*) OVER (PARTITION BY itemid) AS cnt
FROM table t
) t2
ON t1.itemId <> t2.itemId AND t1.cnt = t2.cnt AND
(t1.identifier1 = t2.identifier1 OR t1.identifier1 IS NULL AND t2.identifier1 IS NULL) AND
(t1.identifier2 = t2.identifier2 OR t1.identifier2 IS NULL AND t2.identifier2 IS NULL)
GROUP BY t1.itemid, t2.itemid
HAVING COUNT(*) = COUNT(t1.itemid) AND COUNT(*) = COUNT(t2.itemid);