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)
您正在尝试更新从中选择的同一个表,这可能是问题的根本原因。