如何利用与 CTE 的并集来查询特定的重复值

问题描述 投票:0回答:1

我正在构建的查询遇到问题。我的目标是创建一个满足两个 CTE 条件的输出,然后组合输出,其中仅显示对于两个 CTE 条件都成立的 ID。我不确定我是否需要 CTE 中分区子句的行号,但我认为我需要一些东西来指定重复值,重复值是两个 CTE 中都存在的 ID。

下面的代码片段从一个较长的查询中获取输出,该查询为我提供了完整的总体:

WITH CTE1 AS
        (SELECT *,
        ROW_NUMBER() OVER (PARTITION BY ID
        ORDER BY DATE) AS RN --row number
        FROM #complete_query_output
        WHERE Decision = 'Declined'
        AND xyz> 0 
        AND (Business_Rule_1= 1 OR Business_Rule_2= 1 OR Business_Rule_3= 1)
        ),
 
CTE2 AS
        (SELECT *,
        ROW_NUMBER() OVER (PARTITION BY ID
        ORDER BY DATE) AS RN
        FROM #complete_query_output
        WHERE abc = 1
        --AND Decision = 'Approved'
        )

SELECT *
FROM CTE1

UNION ALL

SELECT *
FROM CTE2

ORDER BY ID

我已经尝试添加类似下面的内容,但我没有得到所需的输出,因为 ID 字段没有显示两个字段中的 ID。

SELECT *, count(*)
FROM CTE1
GROUP BY ID
HAVING COUNT(*) > 1

UNION ALL

SELECT *, count(*)
FROM CTE2

GROUP BY ID
HAVING COUNT(*) > 1
sql duplicates union common-table-expression
1个回答
0
投票

听起来你正在寻找类似的东西

SELECT id, count(*)
(
SELECT id
FROM CTE1

UNION ALL

SELECT id
FROM CTE2
)
GROUP BY ID
HAVING COUNT(*) > 1

这会从两个 CTE 中获取所有

id
(然后与
union all
组合),然后外部查询按它们进行分组并对其进行计数。

正如您所提到的,将

group by
having
应用于各个 CTE 没有帮助,因为它不考虑它们的总计数。

编辑添加,正如 Stu 在评论中提到的,你可以使用

intersect
。如果您只想识别两个查询中都存在一行的情况,这比我上面建议的更干净:

类似:

SELECT id
FROM CTE1
INTERSECT
SELECT id
FROM CTE2

这不会返回计数(不清楚这是否是必需的),并且可能返回与我最初建议的结果不同的结果。如果 CTE1 有 2 行

ID
=1,CTE2 有 0 行
ID
=1,我的第一个查询会将其视为重复项,但
INTERSECT
查询不会,因此您需要了解数据并在这些情况下你想要什么。

© www.soinside.com 2019 - 2024. All rights reserved.