[英]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.