2013-07-31 124 views
2

我有一个表serviceClusters与列标识(1590值)。然后我有另一个表serviceClustersNew与列ID,文本和评论。在这张表中,我有一些文本和注释的值,ID始终是1.这里是表格的示例:SQL更新行号

[1,dummy1,hello1;

1,dummy2,hello2;

1,dummy3,hello3;

等]

WhaI现在想在列ID值是表serviceClusters加上当前行号的持续指数:在我们的情况下,这将是1591年1592和1593

我试图解决这样的问题:首先,我更新了最高值的列ID,然后我tryed添加行号,但这并不工作:

-- 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) 

通过发送一个命令,我得到错误“语法错误:Ordered Analytical Functio ns不允许在子查询中使用。“你有什么建议吗,我该如何解决这个问题?我知道我可以用易变的表格或添加一列来实现,但是有没有办法创建一个新表格/改变当前表格?

+0

这是甲骨文或MySQL? –

+0

这是Teradata –

回答

6

你必须使用更新不重写它,语法只是有点笨重:

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

你不是在处理大量的数据,所以相关子查询可以达到同样的目的:

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

这假定text_id沿行唯一的。

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