【问题标题】:How to add Order by in sql query如何在sql查询中添加Order by
【发布时间】:2015-03-22 10:32:34
【问题描述】:
update Room set Status = case
                        when Room_Rev.In_DateTime IS NOT NULL and Room_Rev.Out_DateTime IS NULL
                            then 'U'
                        when Room_Rev.In_DateTime IS NOT NULL and Room_Rev.Out_DateTime IS NOT NULL
                            then 'A'     
                        when Room.Status!='R' and Room.Status!='U' and Room.Status!='A'
                            then Room.Status
                         else 'R'
                                end 
                                FROM Room JOIN Room_Rev 
                    ON Room.Room_ID=Room_Rev.Room_ID 
                    and 
                    ((Room_Rev.Start_Date >= '2015-03-22' and Room_Rev.End_Date <= '2015-03-22') 
                                OR 
                    (Room_Rev.Start_Date<= '2015-03-22' and Room_Rev.End_Date> '2015-03-22') 
                                OR 
                    (Room_Rev.Start_Date< '2015-03-22' and Room_Rev.End_Date>= '2015-03-22'))

如何在查询中按 Rev_ID desc 添加订单? 有两张表,分别是 Room 和 Room_Rev, 它们是一对多的关系

最后两行ROM0006已经填了In_DateTime和Out_DateTime, 因此它考虑退房, 最后一行插入新的预订, In_DateTime 为空 因此我需要查询返回“R”(保留状态)

【问题讨论】:

  • 这真的是 Microsoft SQL 服务器吗?如果有,是哪个版本?
  • 你想达到什么目的?
  • 我尝试通过比较开始日期和结束日期来获取房间状态,然后更新房间表
  • 不能在更新语句中使用 order by 子句。在这里订购可以给您什么?
  • UPDATE 只是更新所有符合 WHERE 标准的行 - 在 SQL Server 中,ordering 真的不需要或没有任何好处......因此,UPDATE不支持任何ORDER BY ...

标签: sql sql-server


【解决方案1】:

作为可能的解决方案之一,我建议使用嵌套查询而不是 UPDATE 语句中的联接。更新的逻辑对我来说并不完全清楚,所以我将最终更新留给 OP 以正确排序(注意我在嵌套的 SELECT 语句中使用了top 1 和order by room_ID)。但是,这种方法允许处理适用于 SELECT 的所有常用技术。

update Room set Status = (select TOP 1 case
        when Room_Rev.In_DateTime IS NOT NULL and Room_Rev.Out_DateTime IS NULL
            then 'U'
        when Room_Rev.In_DateTime IS NOT NULL and Room_Rev.Out_DateTime IS NOT NULL
            then 'A'     
        when Room.Status!='R' and Room.Status!='U' and Room.Status!='A'
            then Room.Status
            else 'R'
        end 
    FROM Room_Rev 
    WHERE Room.Room_ID=Room_Rev.Room_ID 
    and 
    ((Room_Rev.Start_Date >= '2015-03-22' and Room_Rev.End_Date <= '2015-03-22') 
                OR 
    (Room_Rev.Start_Date<= '2015-03-22' and Room_Rev.End_Date> '2015-03-22') 
                OR 
    (Room_Rev.Start_Date< '2015-03-22' and Room_Rev.End_Date>= '2015-03-22'))
    ORDER BY Room_Rev.Room_Id
    )

PS。作为一条建议,我仍然认为这种方法是无效的。它会阻止数据的正确规范化。您宁愿在需要时始终动态查询此信息,而不是将静态值写入 ROOM.status

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    相关资源
    最近更新 更多