我有一张表(tblABC),看起来像
-----------------------------
BasicID | Filter 1| Filter2 |
------------------------------
100 1 2
100 3 4
101 8 9
我想选择具有Filter1 = 1和Filter2 = 4的BasicID。即我想得到输出 100
我不能在这里使用AND,因为它只在同一行内搜索。即
select * from tblABC where Filter1=1 and Filter2=4
,没有结果。
截至目前,我使用的查询是
select * from tblABC
where
and BasicID in
(
select BasicID from tblABC
where Filter1 IN (1)
)
and BasicID in
(
select BasicID from tblABC
where Filter2 IN (4)
)
这个对我有用。但是有12个Filter列,当这样的字符串搜索大量运行时,它不会使查询变慢。什么是更有效的方法呢?
我正在使用Microsoft SQL 2014
答案 0 :(得分:2)
尝试以下
select basicid from tblABC where filter1 = 1 intersect
select basicid from tblABC where filter1 = 4
答案 1 :(得分:2)
如果两个过滤器值可以位于不同的行或同一行,则GROUP BY / HAVING
方法将失败(在同一行情况下)。此方法适用于所有情况(@Azar的intersect
查询也可以使用):
select distinct a.BasicID
from tblABC as a
join tblABC as b
on a.BasicID = b.BasicID
where a.Filter1 = 1
and b.Filter2 = 4 ;
如果您需要GROUP BY / HAVING COUNT
方法,此修改也适用于所有情况:
select basicid
from tblABC
where filter1 = 1
or filter2 = 4
group by
basicid
having count(case when filter1 = 1 then 1 end) >= 1
and count(case when filter2 = 4 then 1 end) >= 1 ;
答案 2 :(得分:1)
试试这个:
SELECT BasicID
FROM tblABC
WHERE Filter1=1 OR Filter2=4
GROUP BY BasicID
HAVING COUNT(BasicID)=2
如果是12个过滤器,请将COUNT更改为12。
答案 3 :(得分:1)
如果您确定一行与多个规则不匹配(那么计数可能会关闭且查询中断),您可以使用group by
和count
。
select basicid
from tblABC
where filter1 = 1
or filter2 = 4
group
by basicid
having count(*) = 2 /*number of filters*/
答案 4 :(得分:0)
您可以使用以下查询
SELECT DISTINCT BasicId
FROM tblABC main
WHERE Filter1 = 1
AND EXISTS (SELECT TOP 1 Filter2
FROM tblABC
WHERE tblABC.BasicId = main.BasicId
AND Filter2 = 4)
答案 5 :(得分:0)
您已使用IN子句。您可以轻松创建三个其他变体:使用exists而不是in,使用交集,并使用tblABC的selfjoin。
但据我所知,查询优化器可以自动将您的查询转换为这三种变体,甚至可以获得更多非平凡的重写。
我建议你: