【问题标题】:Logical OR in sqlitesqlite中的逻辑或
【发布时间】:2015-11-30 04:34:14
【问题描述】:

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

mkt_id, dow, dvc, feat, val

val 是文本类型,包含真/假。 (mkt_id, dow, dvc, feat) 构成一个键,val 代表一个值。

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

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

NEXT:向表中添加了另一个维度,称为ptd

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

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

我的解决方案尝试

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而出错。

非常感谢您在优化查询或解决方案的其他方法方面的任何帮助。

【问题讨论】:

    标签: sql sqlite query-optimization


    【解决方案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 中使用的列应该在索引中排在第一位。)

    【讨论】:

    • 有没有办法避免GROUP BY? Group by 会增加查询的成本,如果可能的话,我想避免它。
    • 无论是什么查询,它都必须以某种方式搜索并合并具有匹配 mkt_id/dow/dvc/feat 值的行。使用 GROUP BY,优化至少是可能的
    猜你喜欢
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2011-10-15
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多