【发布时间】: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