2

我有一个带有列标识(1590 个值)的表 serviceClusters。然后我有另一个表 serviceClustersNew 列 ID、文本和评论。在这个表中,我有一些文本和评论的值,ID 总是 1。这里是表的一个例子:

[1,dummy1,你好1;

1、dummy2、hello2;

1、dummy3、hello3;

ETC。]

对于列 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)

通过发送最后一个命令,我收到错误“语法错误:子查询中不允许使用有序分析函数。”。你有什么建议,我该如何解决这个问题?我知道我可以使用 volatile 表或添加列来做到这一点,但是有没有办法不创建新表/更改当前表?

4

3 回答 3

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
于 2013-07-31T16:12:13.083 回答
1

您没有处理大量数据,因此相关子查询可以达到相同的目的:

UPDATE serviceClustersNew 
    SET ID = (select max(ID) from serviceClustersNew) +
             (select count(*)
              from serviceClustersNew scn2
              where scn2.Text_Id <= serviceClustersNew.TextId
             )

这假设text_id沿行是唯一的。

于 2013-07-31T12:56:53.777 回答
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

来源: http ://social.msdn.microsoft.com/Forums/sqlserver/en-US/ee06f451-c418-4bca-8288-010410e8cf14/update-table-using-rownumber-over

于 2013-07-31T13:04:05.443 回答