簡體   English   中英

根據ID所在的行數從SQL查詢中排除行

[英]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計數小於100ATID'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.

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