[英]Sql query for AND on multiple rows
我有一张桌子(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个“过滤器”列,当这样的字符串搜索大量运行时,它不会使查询变慢。 有什么更有效的方法?
我正在使用Microsoft SQL 2014
试试下面
select basicid from tblABC where filter1 = 1 intersect
select basicid from tblABC where filter1 = 4
如果两个过滤器值可以位于不同的行或位于同一行,则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 ;
尝试这个:
SELECT BasicID
FROM tblABC
WHERE Filter1=1 OR Filter2=4
GROUP BY BasicID
HAVING COUNT(BasicID)=2
如果有12个过滤器,请将COUNT更改为12。
如果您确定一行不匹配多个规则,则可以使用group by
和count
(然后计数可能会关闭并且查询会中断)。
select basicid
from tblABC
where filter1 = 1
or filter2 = 4
group
by basicid
having count(*) = 2 /*number of filters*/
您可以使用以下查询
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)
您已经使用了IN子句。 您可以轻松地创建三个其他变体:使用exist而不是in,使用交集以及使用tblABC的自连接。
但据我所知,查询优化器可以将您的查询自动转换为这三个变体,甚至可以得到更多的平凡重写。
我建议你:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.