2013-07-31 5 views
2

У меня есть служба tableClusters с идентификатором столбца (значения 1590). Затем у меня есть еще одна таблица serviceClustersNew с идентификаторами столбцов, текстом и комментариями. В этой таблице у меня есть некоторые значения для текста и комментариев, ID всегда 1. Здесь приведен пример таблицы:SQL UPDATE row Number

[1, dummy1, hello1;

1, dummy2, hello2;

1, dummy3, hello3;

и т.д.]

WhaI хотят теперь для значений в колонке 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) 

посылая последнюю команду, я получить ошибку "Синтаксическая ошибка: упорядоченная аналитическая функция ns не разрешены в подзапросах. ". Есть ли у вас какие-либо предложения, как я могу решить проблему? Я знаю, что могу сделать это с помощью таблицы volatile или путем добавления столбца, но есть ли способ без создания новой таблицы/изменения текущей таблицы?

+0

это оракул или MySQL? –

+0

Это Teradata –

ответ

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

Вы не имеете дело с большим количеством данных, поэтому коррелированный подзапрос может служить той же цели:

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