【问题标题】:Optimising multiple selects with a WHILE loop使用 WHILE 循环优化多项选择
【发布时间】:2017-01-07 23:42:49
【问题描述】:

我需要在下面运行更大版本的 SQL Server 2008 查询(SELECT 的 42 次重复,与下面显示的 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

【问题讨论】:

  • 在我的脑海中 - 如果除了房间 id 没有任何变化,您似乎可以将其简化为在选择中包含多个计数的单个查询?
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(20 多年前),不鼓励使用它
  • 注意到marc_s,我会尝试使用正确的连接;我一直在努力寻找合适的连接条件,所以这样做了,但会再看一遍。干杯
  • 只是每个查询的 room_id 不同吗?如果是这样,您可以使用 PIVOT 语句。样本不是很清楚,因为它是有限的,查询 2、3 和 4 是相同的。一般来说,WHILE 循环比单个 SQL 语句要慢。
  • 您需要摒弃循环在这里会有所帮助的想法。循环是我们在编程语言中做的事情,数据检索是基于设置的,使用循环只会让事情变慢。

标签: sql-server select while-loop multiple-select-query


【解决方案1】:

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

使用 SUMCASE 来避免这种情况并提高可读性

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

【讨论】:

  • 谢谢 TheGameiswar,它看起来更加优雅,并且只使用了 47 行而不是 300+。我对它们了解不够,但我想知道是否可以通过 while 循环进一步简化查询。想知道可以吗?
  • 你能分享一下你是如何使用while循环的吗?
  • 问题是我不知道如何在 SQL 中使用 WHILE 循环(例如 link )。从上面的 cmets 看来,如果可以使用循环,它会更慢,所以我会坚持你提供的解决方案,因为我已经有了它并且可以工作。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2016-03-18
  • 2023-03-18
  • 2018-10-04
  • 1970-01-01
  • 2011-05-14
  • 2020-06-24
  • 2018-03-01
  • 2019-02-19
相关资源
最近更新 更多