在SQL Server中将多个查询合并为一个查询

bzzcjhmw  于 2023-01-29  发布在  SQL Server
关注(0)|答案(2)|浏览(228)

我在SQL Server中有一个名为schedule的表,其中包含以下列(以及其他未列出的列):
| 计划ID|房间ID|登记日期|释放日期|
| - ------|- ------|- ------|- ------|
| 小行星4564|第二章|二〇二二年十二月二十五日|二〇二二年十二月二十六日|
| 小行星4565|三个|二〇二二年十二月二十五日|二〇二二年十二月二十七日|
| 小行星4566|十五|二〇二二年十二月二十六日|二〇二二年十二月二十七日|
| 小行星4567|第二章|二〇二二年十二月二十八日|二〇二二年十二月三十一日|
| 小行星4568|三个|二〇二二年十二月二十八日|二〇二二年十二月三十日|
在我的应用程序的某个部分,我需要显示在某个日期占用的所有房间。
目前我运行的查询如下所示:

SELECT TOP (1) * 
FROM schedule 
WHERE roomId = [theNeededRoom] AND dateFreed < [providedDate] 
ORDER BY dateFreed DESC

问题是,我必须在for循环中运行该查询,以便获得每个房间的信息。
我确信必须有更好的方法在单个查询中完成此操作,该查询可能为每个不同的roomId返回一行,我该如何进行呢?
另外,当房间第一次注册时,dateFreed列有一个空值,如果我想考虑这一点,我如何进行查询,以便在dateFreed值为空的情况下,这是被选择的行?

anhgbhbe

anhgbhbe1#

您可以在最后一个“dateFreed”日期订购时使用TOP(1) WITH TIES
为了有一个“绑定”值来匹配,而不是按“dateFreed DESC”排序,我们可以使用ROW_NUMBER窗口函数来生成同一字段的排名(它将为每个最近的“dateFreed”值存储1,每个“roomId”)。

SELECT TOP (1) WITH TIES * 
FROM schedule 
WHERE dateFreed < [providedDate] 
ORDER BY ROW_NUMBER() OVER(PARTITION BY roomId ORDER BY dateFreed DESC)
tjvv9vkg

tjvv9vkg2#

SELECT
    t.*
FROM
    (
    SELECT
        roomId AS rId,
        max(dateFreed) AS dateFreedMax
    FROM
        schedule s
    GROUP BY
        s.roomId
) AS t
WHERE
    t.dateFreedMax < [providedDate] 
    OR t.dateFreedMax IS NULL

或者

SELECT roomId
    FROM
        schedule s
    GROUP BY s.roomId, dateFreed 
HAVING
    max(dateFreed)<[providedDate]  OR dateFreed IS NULL

相关问题