SQL更新,CTE不更新记录

SQL更新,CTE不更新记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图更新一组在三个特定列中重复的记录。此更新的原因是,尝试将此数据插入更新的数据库架构时发生冲突。冲突是由添加到DM\u ID、DM\u CONTENT\u TYPE\u ID和DMC\u TYPE上的新约束引起的。我需要根据行号将DM\u CONTENT\u TYPE\u ID列调整为1、3或5,以解决此问题。重复数据的示例看起来就是这样。请注意,前三列是相同的 +--------+--------------------+----------+-----------------------

我试图更新一组在三个特定列中重复的记录。此更新的原因是,尝试将此数据插入更新的数据库架构时发生冲突。冲突是由添加到
DM\u ID
DM\u CONTENT\u TYPE\u ID
DMC\u TYPE
上的新约束引起的。我需要根据行号将
DM\u CONTENT\u TYPE\u ID
列调整为1、3或5,以解决此问题。重复数据的示例看起来就是这样。请注意,前三列是相同的

+--------+--------------------+----------+--------------------------------------+
| DM_ID  | DM_CONTENT_TYPE_ID | DMC_TYPE | DMC_PATH                             |
+--------+--------------------+----------+--------------------------------------+
| 314457 | 1                  | TIF      | \\DOCIMG\CD\1965\19651227\7897-0.tif |
| 314457 | 1                  | TIF      | \\DOCIMG\DR\640\0001_640_0001.tif    |
| 314458 | 1                  | TIF      | \\DOCIMG\CD\1965\19651227\7898-0.tif |
| 314458 | 1                  | TIF      | \\DOCIMG\TD\640\0002_640_0001.tif    |
| 314460 | 1                  | TIF      | \\DOCIMG\CD\1965\19651227\7900-0.tif |
| 314460 | 1                  | TIF      | \\DOCIMG\ZZ\640\0003_640_0003.tif    |
| 314461 | 1                  | TIF      | \\DOCIMG\CD\1965\19651227\7901-0.tif |
| 314461 | 1                  | TIF      | \\DOCIMG\ED\6501\03_0001.tif         |
| 314461 | 1                  | TIF      | \\DOCIMG\ZZ\640\0004_640_0004.tif    |
+--------+--------------------+----------+--------------------------------------+
这是绕过约束问题所需的输出:

+--------+--------------------+----------+--------------------------------------+
| DM_ID  | DM_CONTENT_TYPE_ID | DMC_TYPE | DMC_PATH                             |
+--------+--------------------+----------+--------------------------------------+
| 314457 | 1                  | TIF      | \\DOCIMG\CD\1965\19651227\7897-0.tif |
| 314457 | 3                  | TIF      | \\DOCIMG\DR\640\0001_640_0001.tif    |
| 314458 | 1                  | TIF      | \\DOCIMG\CD\1965\19651227\7898-0.tif |
| 314458 | 3                  | TIF      | \\DOCIMG\TD\640\0002_640_0001.tif    |
| 314460 | 1                  | TIF      | \\DOCIMG\CD\1965\19651227\7900-0.tif |
| 314460 | 3                  | TIF      | \\DOCIMG\ZZ\640\0003_640_0003.tif    |
| 314461 | 1                  | TIF      | \\DOCIMG\CD\1965\19651227\7901-0.tif |
| 314461 | 3                  | TIF      | \\DOCIMG\ED\6501\03_0001.tif         |
| 314461 | 5                  | TIF      | \\DOCIMG\ZZ\640\0004_640_0004.tif    |
+--------+--------------------+----------+--------------------------------------+
我开发的脚本如下所示:

;WITH CTE AS
(SELECT -- Grab the documents that have a duplicate.
    DM_ID
    ,DM_CONTENT_TYPE_ID
    ,DMC_TYPE
    ,COUNT(*) 'COUNT'
FROM
    [DM_CONTENT]
GROUP BY
    DM_ID
    ,DM_CONTENT_TYPE_ID
    ,DMC_TYPE
HAVING
    COUNT(*) > 1),
CTE2 AS
(SELECT -- Designate the row number for the duplicate documents.
    DMC.*
    ,ROW_NUMBER() OVER(PARTITION BY DMC.DM_ID, DMC.DM_CONTENT_TYPE_ID, DMC.DMC_TYPE ORDER BY DMC.DMC_PATH) AS 'ROWNUM'
FROM
    [DM_CONTENT] DMC
    JOIN CTE
        ON DMC.DM_ID = CTE.DM_ID),
CTE3 AS
(SELECT -- Set the new document type ID based on the row number.
    *
    ,CASE
        WHEN ROWNUM = 1
            THEN 1
        WHEN ROWNUM = 2
            THEN 3
        WHEN ROWNUM = 3
            THEN 5
        END AS 'DM_CONTENT_TYPE_ID_NEW'
FROM
    CTE2)
UPDATE -- Update the records.
    DMC
SET
    DMC.DM_CONTENT_TYPE_ID = CTE3.DM_CONTENT_TYPE_ID_NEW
FROM
    [DM_CONTENT] DMC
    JOIN CTE3
        ON DMC.DM_ID = CTE3.DM_ID
现在,当我执行脚本时,它表示相应的行已受到影响。但是,当我检查
[DM_CONTENT]
表时,
DM_CONTENT\u TYPE\u ID
实际上尚未更新,仍然保持
1
的值。如果我从
CTE3
中选择
,则
DM\u CONTENT\u TYPE\u ID\u NEW
是合适的新ID。我的逻辑似乎是合理的,但我无法找出我犯了什么错误。有人有什么见解吗?提前谢谢

试试看

UPDATE CTE3
SET DM_CONTENT_TYPE_ID = DM_CONTENT_TYPE_ID_NEW
而不是你现在正在做的


从CTE更新的工作原理与常规表连接的工作原理稍有不同

这样写似乎简单得多:

WITH toupdate AS (
      SELECT DMC.*,
            ROW_NUMBER() OVER (PARTITION BY DMC.DM_ID, DMC.DM_CONTENT_TYPE_ID, DMC.DMC_TYPE
                               ORDER BY DMC.DMC_PATH) AS ROWNUM
      FROM DM_CONTENT DMC
     )
UPDATE toupdate
    SET DM_CONTENT_TYPE_ID = (CASE ROWNUM WHEN 2 THEN 3 WHEN 3 THEN 5 END)
    WHERE ROWNUM > 1;

现在,我发现您的
join
条件仅在
DM_ID
上是可疑的。我认为问题在于CTE和您的表之间存在多个匹配项。更新使用了任意匹配项,而这恰好是遇到的第一个匹配项(因此值为1)。

应该可以处理任意数量的重复项。这样试试

;WITH cte 
     AS (SELECT Row_number() 
                  OVER( 
                    partition BY dm_id, dm_content_type_id, dmc_type 
                    ORDER BY DMC_PATH)     AS Rn, 
                * 
         FROM   dm_content) 
UPDATE cte 
SET    dm_content_type_id = rn + (rn -1)

您正在尝试更新从中选择的同一个表,这可能是问题的根本原因。