[英]Exclude rows from a SQL query based on number of rows an ID is present in
我之前提取了一些數據,發現我的結果太多而無法使用(超過400萬行返回)。 我發現罪魁禍首是一大堆擁有數千條記錄的ID。
這是數據的結構。 我有兩張桌子。 tbl1具有每個'ATID'的單個記錄(ATID基本上是比例id)。 然而,每個ATID本質上都是它自己的表 - 它有一個記錄表中的每個項目。 tbl2枚舉這些項目 - 每個ATID的每個比例項都有一行。 因此,對於每個ATID,它有1到500,000行(我知道,相當多)。
我想排除有超過100行的ATID。 僅供參考我這是一個我只讀訪問的數據庫。
這是我的原始查詢:
SELECT tbl1.ATID, tbl1.ATDesc, tbl2.AValue, tbl2.ADesc, tbl2.APosNeg
FROM tbl1 LEFT OUTER JOIN tbl2 ON (tb1.ATID = tbl2.ATID);
這是我用來獲取每個ATID的tbl2中的ATID和記錄計數列表的查詢:
select ATID, count(*) as row_count
from tbl2
group by ATID
order by row_count desc;
對於我的最終產品,我只想返回tbl2中少於100行的ATID。 但是,如果我甚至嘗試使用row_count變量向第二個查詢添加WHERE子句,它將失敗。 所以我不知道如何組合兩個查詢並獲取WHERE子句。
我唯一的選擇是在我知道他們有太多記錄時特別排除ATID,但是有太多要排除(即使用WHERE NOT ATID = 1016而不是ATID = 554而不是....等)
你已經完成了,只需將兩個查詢放在一起:
SELECT tbl1.ATID, tbl1.ATDesc, tbl2.AValue, tbl2.ADesc, tbl2.APosNeg
FROM tbl1 LEFT OUTER JOIN tbl2 ON (tb1.ATID = tbl2.ATID)
WHERE tbl1.ATID NOT IN (
select ATID
from tbl2
group by ATID
HAVING COUNT(*) >= 100
)
這是使用它的一種方法
Count() Over()
窗口聚合將count
tbl2
表中每個ATID
的記錄數。 然后計數可用於在Join
條件下過濾ATID
SELECT tbl1.ATID,
tbl1.ATDesc,
tbl2.AValue,
tbl2.ADesc,
tbl2.APosNeg
FROM tbl1
LEFT OUTER JOIN (SELECT Count(1)OVER(partition BY ATID) AS cnt,*
FROM tbl2) tbl2
ON tb1.ATID = tbl2.ATID
AND tbl2.cnt <= 100;
注意:如果你不想從tabl1
所有ATID's
,那么將tbl2.cnt <= 100
條件移動到Where
子句,這樣你就可以獲得在tbl2
計數小於100
的ATID's
計數
對於SQL Server,請使用CTE(比子查詢更快)。 此外,您的查詢中不必要的括號
with RowCo as
(
select ATID, count(*) as row_count
from tbl2
group by ATID
having row_count <= 100
)
SELECT tbl1.ATID, tbl1.ATDesc, tbl2.AValue, tbl2.ADesc, tbl2.APosNeg
FROM tbl1
inner join RowCo
on RowCo.ATID = tbl1.ATID
LEFT JOIN tbl2
ON tb1.ATID = tbl2.ATID
對於第二個查詢,與聚合函數相關的過濾器在HAVING部分進行
select ATID, count(*) as row_count
from tbl2
group by ATID
order by row_count desc;
having count(*) < 100
對於第一個查詢,您只需使用子查詢
SELECT tbl1.ATID, tbl1.ATDesc, tbl2.AValue, tbl2.ADesc, tbl2.APosNeg
FROM tbl1
LEFT OUTER JOIN tbl2 ON (tb1.ATID = tbl2.ATID)
WHERE tbl1.ATID in (select ATID
from tbl2
group by ATID
having count(*) < 100)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.