我有一个名为Folders
的表。在此表中,某些文件夹的ParentID
设置为0.我想将这些文件夹移动到名为Archives
的文件夹中。
Archives
文件夹将成为这些文件夹的父文件夹。但是我想要存档的文件夹必须早于2015年。而且它们不应包含另一个父文件。
如果符合以下条件,我希望更改ParentID
个文件夹:
Project ID = 100
ParentID = 0
我正在尝试此查询
SELECT *
FROM Folders
WHERE ProjectID = 100
AND CAST (CreateDate AS DATE) < '2015-01-01'
EXCEPT
SELECT *
FROM Folders
WHERE ProjectID = 100 AND ParentID > 0;
我认为使用上面的查询来选择记录很好,但是如何在结果上使用update语句?
请问上面的查询还会列出档案文件夹,但我可以在更新所有记录后编辑它的父文件夹。
有什么想法吗?
答案 0 :(得分:1)
如果我正确理解您的要求,此SQL查询还应返回正确的行 - 正确吗?
SELECT *
FROM Folders
WHERE ProjectID = 100
AND CAST (CreateDate AS DATE) < '2015-01-01'
AND ParentID = 0;
(为什么要将CreatedDate
作为DATE
投射?它的数据类型是什么?不应该已经成为DATE
吗? ?)
如果是这样,您可以使用基于此查询的CTE(公用表表达式)来更新表:
DECLARE @ArchiveFolder INT = 99999; // or whatever it is
;WITH RowsToUpdate AS
(
SELECT PrimaryKeyColumn
FROM dbo.Folders
WHERE ProjectID = 100
AND CAST (CreateDate AS DATE) < '2015-01-01'
AND ParentID = 0;
)
UPDATE f
SET ParentID = @ArchiveFolder
FROM dbo.Folders f
INNER JOIN RowsToUpdate upd ON f.PrimaryKeyColumn = upd.PrimaryKeyColumn
基本上,CTE选择表的主键来更新,对于那些符合所有条件的行 - 以及以下UPDATE
语句然后更新{{{ 1}}表中的主键列表。