更新SQL Server表

时间:2016-04-17 15:57:51

标签: sql sql-server

我有一个名为Folders的表。在此表中,某些文件夹的ParentID设置为0.我想将这些文件夹移动到名为Archives的文件夹中。

Archives文件夹将成为这些文件夹的父文件夹。但是我想要存档的文件夹必须早于2015年。而且它们不应包含另一个父文件。

如果符合以下条件,我希望更改ParentID个文件夹:

  1. Project ID = 100
  2. 创建日期< 2015-01-01之前
  3. ParentID = 0
  4. 我正在尝试此查询

    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语句?

    请问上面的查询还会列出档案文件夹,但我可以在更新所有记录后编辑它的父文件夹。

    有什么想法吗?

1 个答案:

答案 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}}表中的主键列表。