sqlite中的逻辑OR

时间:2015-09-04 05:47:47

标签: sql sqlite query-optimization

我有一张包含以下尺寸的表格:

mkt_id, dow, dvc, feat, val

val是text类型,包含true / false。 (mkt_id,dow,dvc,feat)形成一个键,val表示一个值。

要选择各种键 - 值对,我使用了查询:

SELECT * from <tablename> where mkt_id in (...) and feat = 'xyz'

NEXT :在名为ptd的表格中添加了另一个维度。

对于密钥(mkt_id,doq,dvc,feat)的相同组合,由于添加了维度val,我得到了ptd的多个值。

现在我的要求是,如果特定键(mkt_id,doq,dvc,feat)的任何值为true,我必须将值输出为True,否则为false。

我尝试解决方案

SELECT mkt_id, dow, dvc, feat, 
CASE WHEN trueCount >= 1 THEN 'true' ELSE 'false' END as val 
FROM( SELECT DISTINCT mkt_id,dow,dvc,feat,
SUM( CASE WHEN val='true' THEN 1 ELSE 0 END ) AS trueCount 
FROM <tablename> WHERE mkt_id in (...) and feat = 'xyz'

问题是此查询需要花费大量时间才能执行,并最终因database or disk full而导致错误。

非常感谢任何有关优化查询或解决方案的方法的帮助。

1 个答案:

答案 0 :(得分:1)

要为每个mkt_id / dow / dvc / feat组合获取一个输出行,请在这些列上使用GROUP BY。

比较字符串时,true大于false,因此您可以使用MAX()来选择它:

SELECT mkt_id, dow, dvc, feat, MAX(val) AS val
FROM MyTableNameIsTopSecret
WHERE ...
GROUP BY mkt_id, dow, dvc, feat

(可以使用这四列上的单个索引优化GROUP BY; WHERE中使用的列应该在索引中排在第一位。)