【问题标题】:Query a table that have 2 cols with multiple criteria查询具有 2 列且具有多个条件的表
【发布时间】:2015-10-06 19:16:56
【问题描述】:

我有一个具有以下结构和示例数据的表:

现在我想查询value等于#@的记录。
例如根据上图,应该返回12

id
-----
1 
2    

如果参数是@#$,它应该给我们1。因为只有 ID 为 1 的记录具有所有给定值。

id
-----
1 

【问题讨论】:

标签: sql performance sqlite android-sqlite


【解决方案1】:

您可以使用 group by 并且必须获取包含您要查找的项目数量的不同计数的不同 ID

SELECT Id
FROM Table
WHERE Value IN ('#','$')
GROUP BY Id
HAVING COUNT(DISTINCT Value) = 2

SELECT Id
FROM Table
WHERE Value IN ('#','$','@')
GROUP BY Id
HAVING COUNT(DISTINCT Value) = 3

SQL Fiddle你可以用这个链接测试

【讨论】:

  • 在某些情况下它不起作用。例如记录 1 有 2 个# 值,但我们的逻辑是让记录具有所有值
  • 这就是HAVING COUNT(DISTINCT Value) = 2 为您所做的......它只会计算# 一次
  • 这种方式的好处是,如果参数是可变的,则可以将它们放入一个表变量中并加入 - 类似的计数将给出有效的结果。
【解决方案2】:

有几种方法可以做到这一点。

子查询方法:

SELECT DISTINCT Id
FROM Table
WHERE Id IN (SELECT Id FROM Table WHERE Value = '@')
    AND Id IN (SELECT Id FROM Table WHERE Value = '@');

相关子查询方法:

SELECT DISTINCT t.Id
FROM Table t
WHERE EXISTS (SELECT 1 FROM Table a WHERE a.Id = t.Id and a.Value = '@')
    AND EXISTS (SELECT 1 FROM Table b WHERE b.Id = t.Id and b.Value = '#');

还有 INTERSECT 方法:

SELECT Id FROM Table WHERE Value = '#'
INTERSECT
SELECT Id FROM Table WHERE Value = '@';

最佳性能取决于 RDBMS 供应商、表大小和索引。并非所有 RDBMS 供应商都支持所有方法。

【讨论】:

    【解决方案3】:

    也许像这样的多重自我加入?

    select
      distinct t1.id
    from
      table t1
      join table t2 on (t1.id=t2.id)
      join table t3 on (t1.id=t3.id)
       ...
    where
      t1.value='@' and
      t2.value='#' and
      t3.value='$' and
       ...
    

    【讨论】:

    • 没有计划就很难说什么。但你也可以用exists 做类似的事情。一些索引通常也有帮助。
    猜你喜欢
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多