使用EXISTS
而不是IN
:存在更清晰(恕我直言),在大多數情況下它也更快。 (IN (...)
需要刪除/抑制重複項和NULL,因此:對集進行排序)
在這種特殊情況下:聚合子查詢僅用於找出組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空值的抑制:在WHERE ex.column1 = tt.column1
子句將始終產生錯誤如果任ex.column1
或tt.column1
(或兩者)碰巧是NULL。
UPDATE。看來,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
);
另一個(很明顯)的方法是明確地檢查空值,但是這將需要一個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
);
有像COLUMN1指數(KEY(列1))? –
你有一些示例數據嗎? –