簡體   English   中英

在多行上進行AND的SQL查詢

[英]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 bycount (然后計數可能會關閉並且查詢會中斷)。

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的自連接。

但據我所知,查詢優化器可以將您的查詢自動轉換為這三個變體,甚至可以得到更多的平凡重寫。

我建議你:

  • 首先,讓優化器工作。
  • 其次,如果您的查詢最終變慢,則在BasicID上創建(如果不存在)索引。
  • 第三,如果查詢仍然很慢,則在filter1和filter2上使用兩個位圖索引。
  • 第四,如果仍在緩慢使用和建立索引視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM