我有一个带有列标识的表serviceClusters(1590个值)。然后我有另一个表serviceClustersNew与列ID,文本和注释。在此表中,我有一些文本和注释的值,ID始终为1.这里是表的示例:
[1,dummy1,hello1;
1,dummy2,hello2;
1,dummy3,hello3;
等]
我现在想要的是列ID中的值是表serviceClusters的连续索引加上当前的行号:在我们的例子中,这将是1591,1592和1593.
我试图像这样解决问题:首先我用最大值更新了列ID,然后我尝试添加行号,但这不起作用:
-- Update ID to the maximum value 1590
UPDATE serviceClustersNew
SET ID = (SELECT MAX(ID) FROM serviceClusters);
-- This command returns the correct values 1591, 1592 and 1593
SELECT ID+ROW_NUMBER() OVER (ORDER BY Text_ID) AS RowNumber
FROM serviceClustersNew
-- But I'm not able to update the table with this command
UPDATE serviceClustersNew
SET ID = (SELECT ID+ROW_NUMBER() OVER (ORDER BY Text_ID) AS RowNumber FROM
serviceClustersNew)
通过发送最后一个命令,我收到错误“语法错误:子查询中不允许有序分析函数。”。你有什么建议吗,我怎么解决这个问题?我知道我可以使用易失性表或添加列来实现它,但有没有办法在不创建新表的情况下/改变当前表?
答案 0 :(得分:6)
你必须使用UPDATE FROM重写它,语法有点笨重:
UPDATE serviceClustersNew
FROM
(
SELECT text_id,
(SELECT MAX(ID) FROM serviceClusters) +
ROW_NUMBER() OVER (ORDER BY Text_ID) AS newID
FROM serviceClustersNew
) AS src
SET ID = newID
WHERE serviceClustersNew.Text_ID = src.Text_ID
答案 1 :(得分:1)
您没有处理大量数据,因此相关子查询可以起到同样的作用:
UPDATE serviceClustersNew
SET ID = (select max(ID) from serviceClustersNew) +
(select count(*)
from serviceClustersNew scn2
where scn2.Text_Id <= serviceClustersNew.TextId
)
这假设text_id
在行中是唯一的。
答案 2 :(得分:0)
显然你可以通过CTE更新基表......不知道。所以,只需将你的最后一个UPDATE语句更改为此,你应该是好的。请务必在CTE中包含您想要更新的任何字段。
;WITH cte_TEST AS
( SELECT
ID,
ID+ROW_NUMBER() OVER (ORDER BY TEXT_ID) AS RowNumber FROM serviceClustersNew)
UPDATE cte_TEST
SET cte_TEST.ID = cte_TEST.RowNumber