我要更新15条记录,因为前5条记录的日期应为2019年6月,下5条记录应为2019年7月,最后5条记录应为2019年8月(基于员工ID),任何人都可以告诉我如何编写此类型的查询在SQL Server Management Studio V 17.7中,我尝试使用以下查询,但无法对接下来的5行进行操作。
就像下面的查询
Update TOP(5) emp.employee(nolock) set statusDate=GETDATE()-31 where EMPLOYEEID='XCXXXXXX';
答案 0 :(得分:0)
要仅更新表的特定数量的行,您将需要包含FROM子句并加入子查询以限制行数。我建议使用OFFSET AND FETCH而不是top,这样您就可以跳过X行数
您还将希望使用DATEADD函数,而不是直接从DateTime函数GETDATE()中减去一个数字。我不确定,但我认为您的查询将减去毫秒。如果您打算回去一个月,我建议您减去一个月而不是31天。另外,也可以更容易地指定一个确切的日期,例如“ 2019-06-01”
例如:
TableA -TableAID INT PK -员工编号INT FK -statusDate DATETIME
UPDATE TableA
SET statusDate = '2019-06-01'
FROM TableA
INNER JOIN
(
SELECT TableAID
FROM TableA
WHERE EmployeeID = ''
ORDER BY TableAID
OFFSET 0 ROWS
FETCH NEXT 5 ROWS ONLY
) T1 ON TableA.TableAID = T1.TableAID
现在,您的原始查询似乎正在更新表employee而不是purchases表。您将要用要更新的表替换我的TableA,并用它的PK字段替换TableAID。
答案 1 :(得分:0)
您可以使用ROW_NUMBER
来获得员工的排名,然后只需更新前15行即可。
;WITH EmployeeRowsWithRowNumbers AS
(
SELECT
T.*,
RowNumberByEmployee = ROW_NUMBER() OVER (
PARTITION BY
T.EmployeeID -- Generate a ranking by each different EmployeeID
ORDER BY
(SELECT NULL)) -- ... in no particular order (you should supply one if you have an ordering column)
FROM
emp.employee AS T
)
UPDATE E SET
statusDate = CASE
WHEN E.RowNumberByEmployee <= 5 THEN '2019-06-01'
WHEN E.RowNumberByEmployee BETWEEN 6 AND 10 THEN '2019-07-01'
ELSE '2019-08-01' END
FROM
EmployeeRowsWithRowNumbers AS E
WHERE
E.RowNumberByEmployee <= 15