【问题标题】:SQL Update multiple lines from querySQL 从查询中更新多行
【发布时间】:2014-09-10 12:31:16
【问题描述】:

我已经编写了 2 个查询,我需要考虑将它们组合成我认为必须是游标的内容。第一个查询看起来像这样-

DECLARE @Date DATETIME
SET @Date = '12-July-2014'

SELECT  Date AS SaturdayDate
          , DayOfWeek

 FROM (
SELECT DATE
          , DATENAME(DW,DATE) as DayOfWeek
          , ROW_NUMBER() OVER (ORDER BY Date) AS rownum
     FROM tblCalender
     WHERE DATENAME(DW,DATE) = 'Saturday'
          AND Date > @Date
          ) AS t
          WHERE t.rownum % 4 = 0
                AND DATEPART(YEAR, Date) = DATEPART(Year, GETDATE())

在 7 月 12 日之后的剩余时间里,每第 4 个星期六返回 -

SaturdayDate            |DayOfWeek
2014-08-09 00:00:00.000 |Saturday
2014-09-06 00:00:00.000 |Saturday
2014-10-04 00:00:00.000 |Saturday
2014-11-01 00:00:00.000 |Saturday
2014-11-29 00:00:00.000 |Saturday
2014-12-27 00:00:00.000 |Saturday

这非常适合我的需要,然后我需要使用上述结果作为@SaturdayDate 参数运行更新查询(需要它循环并更新每条记录)

UPDATE    dbo.tblStaffRota
SET              StartTime = '11:00:00'
WHERE     (EmployeeID IN ('JJJ','HSW', 'GPH', 'DVD')) 
                AND (StartTime = '10:30:00')            
                AND (Date BETWEEN @SaturdayDate - 6 AND @SaturdayDate)

因此,更新查询将循环遍历第一个查询的结果,用新的开始时间更新每个日期,不知道如何进行此操作,我找到的所有答案都没有帮助。希望这足够清楚。谢谢

*附加说明 - 更新需要查看前一周到每个星期六出现的天数,并更改任何开始时间。

正在使用的表格示例。

基于此,如果星期六在列表中,更新将更改 18 日和 19 日的开始时间。

【问题讨论】:

    标签: sql-server-2008 sql-update


    【解决方案1】:

    看起来您需要类似的东西(注意:以下脚本尚未经过测试)..

    根据发布的样本数据修改

        DECLARE @Date DATETIME
    SET @Date = '12-July-2014'
    
    
    UPDATE    STAFFROTA
    SET              StartTime = '11:00:00'
    FROM dbo.tblStaffRota STAFFROTA 
        INNER JOIN
        (
                SELECT DATEADD(d, -6, Date) AS SaturdayDateStart,  Date AS SaturdayDateEnd
                      , DayOfWeek
            FROM (
            SELECT DATE
                      , DATENAME(DW,DATE) as DayOfWeek
                      , ROW_NUMBER() OVER (ORDER BY Date) AS rownum
                 FROM tblCalender
                 WHERE DATENAME(DW,DATE) = 'Saturday'
                      AND Date > @Date
                      ) AS t
                      WHERE t.rownum % 4 = 0
                            AND DATEPART(YEAR, Date) = DATEPART(Year, GETDATE())
    
        ) SAT
        ON STARFFROTA.[Date] BETWEEN SAT.SaturdayDateStart AND SAT.SaturdayDateEnd
    WHERE     (STARFFROTA.EmployeeID IN ('JJJ','HSW', 'GPH', 'DVD')) 
                    AND (STARFFROTA.StartTime = '10:30:00')            
    

    【讨论】:

    • 不是安静地让我去我需要的地方,更新查询需要更新员工在 10:30 开始的前几天。因此,如果他们在那个星期六工作,则需要更改开始时间。
    • 能否贴出tblStaffRotatblCalender这两个表的一些样本数据
    • @Gavlaaa .. 根据您的示例数据修改了代码。我相信这就是您所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2019-10-02
    • 2013-08-08
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多