(我的简化版本)查询如下所示:
SELECT id
FROM table
WHERE column1
IN
(
SELECT column1
FROM table
GROUP BY column1
HAVING COUNT(*) > 1
)
这将选择一个id的列表,其中column1具有多个出现的值(换句话说,它们不是唯一的)。这可以按预期工作,但有一个例外:如果多次出现NULL值(这是可能的),则不会选择任何ID。万一NULL是非唯一的,选择列ID的正确方法是什么?
使用EXISTS
代替IN
:存在更清晰(IMHO),并且在大多数情况下,它也更快。(IN (...)
需要删除/删除重复项和NULL,因此:对集合进行排序)
在这种特殊情况下:仅需要聚合子查询来找出group count() > 1
。查询优化器可能没有意识到这一点,并在将它们与进行比较之前计算了完整的组计数(在完整的行集合中)1
。
SELECT tt.id
FROM thetable tt
WHERE EXISTS (
SELECT * FROM thetable ex
WHERE ex.column1 = tt.column1 AND ex.id <> tt.id
);
WRT对NULL的抑制:WHERE ex.column1 = tt.column1
如果一个ex.column1
或tt.column1
(或两者)碰巧为NULL,则该子句将始终产生false 。
更新。看来,OP也想要带有的元组column1 IS NULL
(如果有更多的元组)。简单的解决方案是使用前哨值(不是本地存在的值columnn1
)并将其用作替代值:(在下面的片段中-1
用作替代值)
SELECT tt.id
FROM thetable tt
WHERE EXISTS (
SELECT * FROM thetable ex
WHERE COALESCE(ex.column1, -1) = COALESCE(tt.column1, -1)
AND ex.id <> tt.id
);
另一种(显而易见的)方法是显式检查NULL,但这将需要一个OR
子句和一堆括号,例如:
SELECT tt.id
FROM thetable tt
WHERE EXISTS (
SELECT * FROM thetable ex
WHERE (ex.column1 = tt.column1
OR (ex.column1 IS NULL AND tt.column1 IS NULL)
)
AND ex.id <> tt.id
);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句