SQL:使用EXIST重用Query

问题描述 投票:0回答:2

好的,所以我的查询看起来像

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-server tsql case
2个回答
2
投票

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

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)

0
投票

你可以这样做:

SELECT A.Length,
       CASE COUNT(CASE A.[LENGTH] WHEN B.[LENGTH] - 10 THEN 1 END)WHEN 0 THEN 'No' ELSE 'Yes' END AS result1,
       CASE COUNT(CASE A.[LENGTH] WHEN B.[LENGTH] + 10 THEN 1 END)WHEN 0 THEN 'No' ELSE 'Yes' END AS result2,
       CASE COUNT(CASE A.[LENGTH] WHEN B.[LENGTH] THEN 1 END)WHEN 0 THEN 'No' ELSE 'Yes' END AS result3
FROM A
     CROSS JOIN B
GROUP BY A.Length;

这节省了对B表的3次扫描,但您仍需要某种重复逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.