sql-server - SQL:使用 EXIST 重用查询
问题描述
好的,所以我有一个看起来像的查询
SELECT
CASE WHEN EXISTS(SELECT NULL
FROM B
WHERE B.LENGTH = A.LENGTH + 10)
THEN 'Yes'
ELSE 'No'
END AS Result1,
CASE WHEN EXISTS(SELECT NULL
FROM B
WHERE B.LENGTH = A.LENGTH - 10)
THEN 'Yes'
ELSE 'No'
END AS Result2,
CASE WHEN EXISTS(SELECT NULL
FROM B
WHERE B.LENGTH = A.LENGTH)
THEN 'Yes'
ELSE 'No'
END AS Result3
FROM A
如您所见,这 3 个 EXIST 查询几乎相同,几乎没有区别,(我希望)可以作为参数传递。
我试图创建一个 TVF,但当我返回时它会失败,SELECT NULL...
但如果我使用SELECT *
. 我害怕的是我不需要我想要检查的值是否仅存在,仅此而已。
我的问题是重构这段代码的最佳方法是什么,这样它就不会那么重复了?
解决方案
您可以使用条件聚合为每行生成一个查询,其中包含三列:
SELECT CASE WHEN CA.C1 > 0 THEN 'Yes' ELSE 'No' END
, CASE WHEN CA.C2 > 0 THEN 'Yes' ELSE 'No' END
, CASE WHEN CA.C3 > 0 THEN 'Yes' ELSE 'No' END
FROM A
CROSS APPLY (
SELECT COUNT(CASE WHEN B.LENGTH = A.LENGTH + 10 THEN 1 END)
, COUNT(CASE WHEN B.LENGTH = A.LENGTH - 10 THEN 1 END)
, COUNT(CASE WHEN B.LENGTH = A.LENGTH THEN 1 END)
FROM B
WHERE B.LENGTH IN (A.LENGTH + 10, A.LENGTH - 10, A.LENGTH)
) AS CA(C1, C2, C3)
推荐阅读
- go - 使用结构解析 YAML
- python - 将列表值插入不同的行,同时保留其他列的最新值
- javascript - Sails - 如何知道控制器或助手是否已经结束?
- excel - 尝试使用 excel 2010 vba 解决“重命名”表
- wordpress - 在 Woocommerce 3 中自定义购物车项目删除通知
- batch-file - 如何在批处理文件中制作工作菜单?
- python - 将库依赖项注入 django 模型
- javascript - 使用 jQuery 中的一个按钮隐藏/显示 div
- r - 从字符串中提取金额
- powershell - 通过 PowerShell 清除 IE 上的 SSL 状态