有效地检查分组集合中的存在性

时间:2015-10-22 21:19:24

标签: sql sql-server

我想将一个列分组,检查另一个列中的某个布尔表达式。

例如,假设我有一个表:

MyTable的

ID  | ColA
----------
1     A
1     B
1     C
2     A
2     C

我想要做的是通过一些布尔选择逻辑获取所有记录。例如,获取ColA存在且值AB

的所有ID

类似于

的东西
SELECT ID, ColA
FROM MyTable
WHERE ID IN (SELECT ID FROM MyTable WHERE ColA = 'A')
AND ID IN (SELECT ID FROM MyTable WHERE ColA = 'B')

返回选择

ID | ColA
---------
1    A
1    B
1    C

像上面这样的东西会起作用,但它似乎并不太有效。

2 个答案:

答案 0 :(得分:2)

我会使用exists编写查询,然后确保定义了一些索引:

SELECT t.ID, t.ColA
FROM MyTable t
WHERE EXISTS (SELECT 1 FROM MyTable t2 WHERE t2.ID = t.ID AND t2.ColA = 'A') AND
      EXISTS (SELECT 1 FROM MyTable t2 WHERE t2.ID = t.ID AND t2.ColA = 'B') ;

您想要的索引是MyTable(id, ColA)

答案 1 :(得分:0)

您提出的查询对于您提出的问题并不算太糟糕。不,它看起来效率不高,但你要求做的事情不能很有效率地进行。

这种变化至少有点更清晰,也许SQL Server的查询规划器可以用它做一些有用的事情:

SELECT ID, ColA
FROM MyTable
WHERE ID IN (
  SELECT ID FROM MyTable WHERE ColA = 'A'
  INTERSECT
  SELECT ID FROM MyTable WHERE ColA = 'B'
)