是否可以只用一个替换以下两个SQL选择?

时间:2013-09-10 14:30:53

标签: sql sql-server sql-server-2008

请观察:

DECLARE @UseFastLane BIT


SELECT TOP 1 @UseFastLane = 1
FROM   BackgroundJobService
WHERE  IsFastLane = 1;


SELECT TOP 1 bjs.HostName    AllocatedAgentHostName,
             bjs.ServiceName AllocatedAgentServiceName,
             bjs.IsFastLane,
             SUM(CASE
                   WHEN bjw.WorkStatusTypeId IN ( 2, 3, 4, 10 ) THEN 1
                   ELSE 0
                 END)        AS InProgress
FROM   BackgroundJobService bjs
       LEFT JOIN BackgroundJobWork bjw
         ON bjw.AllocatedAgentHostName = bjs.HostName
            AND bjw.AllocatedAgentServiceName = bjs.ServiceName
WHERE  bjs.AgentStatusTypeId = 2
       AND bjs.IsFastLane = COALESCE(@UseFastLane, 0)
GROUP  BY bjs.HostName,
          bjs.ServiceName,
          bjs.IsFastLane
ORDER  BY IsFastLane DESC,
          InProgress 

我在这里使用两个SQL select语句。是否可以只使用一个顶级SQL select语句,将另一个嵌套在?

1 个答案:

答案 0 :(得分:0)

您可以将文字AND bjs.IsFastLane = COALESCE(@UseFastLane, 0)替换为:

AND bjs.IsFastLane = (SELECT Max(IsFastLane)
FROM   BackgroundJobService)

假设BackgroundJobService中有行,它应该给你一个等价的查询。

如果BackgroundJobService中可能有零行,那么您可以使用COALESCE函数包装select以返回0,如下所示:

COALESCE((SELECT Max(IsFastLane) FROM BackgroundJobService), 0)