sql - 在 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)
解决方案
您可以使用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
推荐阅读
- elasticsearch - org.elasticsearch.rest.RestController.registerFilter 在 5.6.8 中消失了
- symfony - Composer create-project symfony/skeleton new_project "4.0"
- r - predict.coxph 中新数据的困难
- python - 计算列中的值 Igonorig AlphaNumeric 值
- amazon-ec2 - EC2InstanceMetadata.IAMSecurityCredentials 为空
- c# - WebHttpRequest fails (500) while postman successfully runs the web GET request
- r - 在 3 维数组上矢量化 R 中的嵌套循环
- php - 带有 WordPress HTTP API 的 AJAX
- azure-devops - VSTS 手动测试失败,已创建错误,什么是重新测试触发器?
- continuous-integration - 当分支是主分支并且 Travis 没有构建拉取请求时,如何有条件地将部署步骤添加到 .travis.yml?