我正在尝试找出一个有效的(Oracle)SQL语句,用于验证列是否至少包含一次特定的值列表。
一种选择是过滤该列表,输出所有不同的值,然后计算它们。所以,像这样:
SELECT count(*)
FROM (
SELECT DISTINCT columnname
FROM table
WHERE columnname in ('a', 'b', 'c')
)
;
(然后检查count(*)是否返回数字3)
这个问题是DISTINCT语句查看整个表,这在性能方面非常糟糕。我的列表中的所有三个值都可能在一开始,所以我不需要查看数百万个其他行。我只想知道该列包含'a','b'和'c'。
有没有人有想法有效地解决这个问题?
提前致谢!
答案 0 :(得分:2)
单独查找每个值可能更有效:
select (case when exists (select 1 from t where col = 'a') and
exists (select 1 from t where col = 'b') and
exists (select 1 from t where col = 'c')
then 1 else 0
end) as has_all_three_flag
from dual;
对于t(col)
上的索引,这会更好。
答案 1 :(得分:0)
如果您希望摆脱不同,请尝试以下操作,Group by的性能优于distinct See here。
SELECT count(*)
FROM (
SELECT columnname
FROM table
WHERE columnname in ('a', 'b', 'c')
GROUP BY columnname
)
;
或者您可以通过
避免使用子查询SELECT count(DISTINCT columnname)
FROM table
WHERE columnname in ('a', 'b', 'c');