首页 > 解决方案 > SQL 使用前 5 个结果作为过滤器

问题描述

我需要找出 SQL 机制以使用我用 CTE 计算的 5 个类别来过滤我的整体结果。当我用逗号“加入”时:从表中,结果会成倍增加。由于 cte 中的计数计算,我真的没有一个字段可以进行正确的连接。

我觉得它应该是 where 语句中的子查询,但我有 5 个结果,我认为它只适用于 1 个结果。

我已经尝试过(尽我所能)cte,各种子查询,有,存在

工作 CTE:

DECLARE @END VARCHAR(25)='2021-04-04 23:59:59.000'  --Sunday

DECLARE @START DATEtime = DATEADD(DD,-364,@END)

;With CTE as (

Select Top 5

          TIER_3 

         ,COUNT(INCIDENT_NUMBER) AS CTE_Count    

    FROM vIncidentTickets

   WHERE LAST_RESOLVED_DATE between @START and @END

     AND GROUP = 'Cell'

     AND COMPANY = 'HQ'

     AND ORGANIZATION = 'CSS'

GROUP BY TIER_3

ORDER BY COUNT(INCIDENT_NUMBER) DESC
)

--选择部分没有提供正确的结果

Select    
          INCIDENT_NUMBER

         ,CTE.TIER_3 

    FROM vIncidentTickets,CTE

   WHERE LAST_RESOLVED_DATE between @START and @END

     AND GROUP = 'Cell'

     AND COMPANY = 'HQ'

     AND ORGANIZATION = 'CSS'

我希望 CTE 结果过滤 Select 查询。

标签: sqlfiltersubquerycommon-table-expression

解决方案


不要使用逗号加入。使用JOIN关键字的标准将近30年了,习惯并使用它。

通过INNER JOIN特别使用,很明显您没有包含任何关联两个表的条​​件(无连接谓词)。

试试这个...

Select    
      v.INCIDENT_NUMBER
     ,CTE.TIER_3 
FROM
    vIncidentTickets   AS v
INNER JOIN
    CTE
        ON CTE.TIER_3 = v.TIER_3
WHERE
     v.LAST_RESOLVED_DATE between @START and @END
 AND v.GROUP = 'Cell'
 AND v.COMPANY = 'HQ'
 AND v.ORGANIZATION = 'CSS'

(您的原始查询有效地使用了CROSS JOIN.)


推荐阅读