我想将一个列分组,检查另一个列中的某个布尔表达式。
例如,假设我有一个表:
MyTable的
ID | ColA
----------
1 A
1 B
1 C
2 A
2 C
我想要做的是通过一些布尔选择逻辑获取所有记录。例如,获取ColA
存在且值A
和B
类似于
的东西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
像上面这样的东西会起作用,但它似乎并不太有效。
答案 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'
)