Sql在多行上查询AND

时间:2015-06-17 09:24:14

标签: sql sql-server

我有一张表(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

6 个答案:

答案 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 bycount

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。

但据我所知,查询优化器可以自动将您的查询转换为这三种变体,甚至可以获得更多非平凡的重写。

我建议你:

  • 首先,让优化器工作。
  • 其次,如果您的查询最终很慢,则在BasicID上创建(如果不存在)索引。
  • 第三,如果查询仍然很慢,则使用两个位图索引,通过filter1和filter2。
  • 第四,如果它仍然是缓慢使用和索引视图。