首页 > 解决方案 > 在 SQL 中检测到重叠,未在选择中使用子查询且未将重复记录添加到结果集中

问题描述

我正在寻找创建一个可以检测到 SQL 中重叠的查询,而无需在选择中使用子查询,也无需将重复记录添加到结果集中。

我知道可以这样做,但考虑到两个表中的记录数量,我正在寻找更快的解决方案。

SELECT x.T1Id
    ,CASE 
        WHEN MaxOtherColumn IS NULL
            THEN 0
        ELSE 1
        END HasOverlapInT2
    ,CASE 
        WHEN MaxOtherColumn IS NULL
            THEN OtherColumn
        ELSE MaxOtherColumn
        END MaxOtherColumn
FROM (
    SELECT CASE 
            WHEN EXISTS (
                    SELECT MAX(T2.OtherColumn)
                    FROM T2
                    WHERE T1.ValidFrom <= T2.ValidUntil
                        AND T2.ValidFrom <= T1.ValidUntil
                        AND t1.T1Id = T2.T1Id
                    )
                THEN 1
            ELSE NULL
            END MaxOtherColumn
        ,T1Id
        ,OtherColumn
    FROM T1
    ) x

我不想为每一行执行存在,而是批量处理它。

样本数据

表格1

T1Id (PK) 有效自 有效期至 其他列
1 2021-01-01 2021-12-31 1
2 2021-09-23 2021-09-24 2

表 2

T2Id (PK) T1Id(FK) 有效自 有效期至 其他列
1 1 2021-01-01 2021-05-31 9000
2 1 2021-06-01 2021-12-31 9001
3 2 2021-01-01 2021-01-05 7000

预期结果

T1Id HasOverlapInT2 MaxOtherColumn
1 1 9001
2 0 2

SQL 服务器兼容级别 = 130 (2016)

标签: sqlsql-serverperformance

解决方案


您可以使用CROSS APPLY来实现您的预​​期结果(您当前的解决方案不会返回您的预期结果):

SELECT x.T1Id,
    CASE 
        WHEN MaxOtherColumn IS NULL
        THEN 0
        ELSE 1
    END HasOverlapInT2,
    CASE 
        WHEN MaxOtherColumn IS NULL
        THEN OtherColumn
        ELSE MaxOtherColumn
    END MaxOtherColumn
FROM
(
    SELECT t.MaxOtherColumn,
        T1Id,
        OtherColumn
    FROM T1
    CROSS APPLY
    (
        SELECT MAX(T2.OtherColumn) MaxOtherColumn
        FROM T2
        WHERE T1.ValidFrom <= T2.ValidUntil
        AND T2.ValidFrom <= T1.ValidUntil
        AND t1.T1Id = T2.T1Id
    ) t
) x

推荐阅读