(Oracle)SQL:列必须包含值列表

时间:2017-12-08 11:19:03

标签: sql oracle

我正在尝试找出一个有效的(Oracle)SQL语句,用于验证列是否至少包含一次特定的值列表。

一种选择是过滤该列表,输出所有不同的值,然后计算它们。所以,像这样:

SELECT count(*)
FROM (
      SELECT DISTINCT columnname
      FROM table
      WHERE columnname in ('a', 'b', 'c')
     ) 
;

(然后检查count(*)是否返回数字3)

这个问题是DISTINCT语句查看整个表,这在性能方面非常糟糕。我的列表中的所有三个值都可能在一开始,所以我不需要查看数百万个其他行。我只想知道该列包含'a','b'和'c'。

有没有人有想法有效地解决这个问题?

提前致谢!

2 个答案:

答案 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');