0

我需要在下面运行更大版本的 SQL Server 2008 查询(42 次重复,与SELECT下面显示的 4 次重复相对)。在我看来,它似乎不是很优化,并且是使用 while 循环的理想候选者,但经过数小时的搜索和尝试后,我无法让它工作。谁能建议一个更优化的查询来完成我的需要?

谢谢

SELECT 
    t1.Occupied as "1", t2.Occupied as "2", 
    t3.Occupied as "3", t4.Occupied as "4"
FROM 
    (SELECT 
         COUNT(function_id) AS Occupied
     FROM 
         ev_functions 
     WHERE 
         room_id = 22 
         AND DATEADD(HOUR,3,GETDATE()) > from_date_time 
         AND GETDATE() < to_date_time 
         AND function_status_id = 6) t1,
    (SELECT 
         COUNT(function_id) AS Occupied
     FROM 
         ev_functions 
     WHERE 
         room_id = 1 
         AND DATEADD(HOUR,3,GETDATE()) > from_date_time 
         AND GETDATE() < to_date_time 
         AND function_status_id = 6) t2,
    (SELECT 
         COUNT(function_id) AS Occupied
     FROM 
         ev_functions 
     WHERE 
         room_id = 1 
         AND DATEADD(HOUR,3,GETDATE()) > from_date_time 
         AND GETDATE() < to_date_time 
         AND function_status_id = 6) t3,
    (SELECT 
         COUNT(function_id) AS Occupied
     FROM 
         ev_functions 
     WHERE 
         room_id = 1 
         AND DATEADD(HOUR,3,GETDATE()) > from_date_time 
         AND GETDATE() < to_date_time 
         AND function_status_id = 6) t4
4

1 回答 1

0

在您的情况下,您正在多次访问同一表以进行一小组更改

使用SUMwithCASE可以避免这种情况,也可以提高可读性

sum(case when room_id = 1 then 1 else 0 end ) as room1,
sum(case when room_id = 22 then 1 else 0 end )..
.....
and so on
from ev_functions 
where  DATEADD(HOUR,3,GETDATE()) > from_date_time 
and GETDATE() < to_date_time 
and function_status_id = 6
于 2016-08-31T11:44:23.160 回答