SQL存储过程中dcOverTimeSummary表与别名D2的关联关系是什么?
问题解答
1. dcOverTimeSummary 与别名 D2 的关系
- 外层主查询的查询对象是
dcOverTimeSummary表,子查询中的别名D2是同一张dcOverTimeSummary表的二次引用,二者通过REASON_CODE、UNF_CIV_IND、Cash_Time_Ind三个维度字段关联匹配,用于计算当前分组对应的去年同期加班费、加班时长指标。
2. 是否为未使用JOIN关键字的自连接
- 不是,该写法属于关联子查询(Correlated Subquery),和传统自连接的核心区别如下:
- 传统自连接会在
FROM子句中声明两次同表的关联关系,通过JOIN关键字(或老式的逗号隐式连接)定义关联条件 - 本写法将D2的查询逻辑放在
SELECT字段列表中,会逐行匹配外层主查询当前行的维度值,筛选去年同期数据做聚合,逻辑上等价于LEFT JOIN自连接,但语法归类属于子查询范畴。
- 传统自连接会在
可选优化建议
现有写法存在两处可优化点:
- 重复写了两次完全相同的关联子查询,性能损耗更高,可改写为
LEFT JOIN自连接+分组聚合的写法,仅计算一次去年同期数据即可- 日期比较前用
FORMAT转字符串的写法存在性能问题、也有格式适配风险,可直接用日期类型比较:D2.Earned_Date >= DATEADD(year, -1, @EarnedDate_frm) AND D2.Earned_Date <= DATEADD(year, -1, @EarnedDate_to)
内容的提问来源于stack exchange,提问作者zbx888
相关产品推荐
相关产品推荐

