查询具有多个条件的2个列的表

时间:2015-10-06 19:16:56

标签: sql performance sqlite android-sqlite

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

enter image description here

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

id
-----
1 
2    

此外,如果参数为@#$,则应该为1提供参数。因为只有标识为1的记录具有所有给定值。

id
-----
1 

3 个答案:

答案 0 :(得分:5)

您可以使用一个组,并且必须获取包含您正在寻找的项目数量的独特计数的不同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)

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

子查询方法:

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供应商都支持所有方法。

答案 2 :(得分:1)

也许像这样多人自我加入?

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
   ...