根据ID所在的行数从SQL查询中排除行

时间:2016-10-07 14:35:26

标签: sql sql-server select count

我之前提取了一些数据,发现我的结果太多而无法使用(超过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而不是....等等)

4 个答案:

答案 0 :(得分:3)

您已经完成了,只需要将两个查询放在一起:

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
)

答案 1 :(得分:3)

以下是使用

执行此操作的一种方法

Count() Over()窗口聚合将count ATID表中每个tbl2的记录数。然后计算可用于过滤ATID条件

中的Join
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; 

注意:如果您不希望ATID's中的所有tabl1,请将tbl2.cnt <= 100条件移至Where条款,这样您就可以获得ATID's

中计数小于100的{​​{1}}计数

答案 2 :(得分:1)

对于SQL Server,使用CTE(比子查询更快)。此外,您的查询中不必要的括号

WebApiConfig.vb

答案 3 :(得分:1)

对于第二个查询,与聚合函数相关的过滤器会出现在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)