首页 > 解决方案 > 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 *. 我害怕的是我不需要我想要检查的值是否仅存在,仅此而已。

我的问题是重构这段代码的最佳方法是什么,这样它就不会那么重复了?

标签: sql-servertsqlcase

解决方案


您可以使用条件聚合为每行生成一个查询,其中包含三列:

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)

推荐阅读