2015-08-06 3 views
0

Возможно ли обновить столбец таблицы, используя значения из того же столбца? Обновление зависит от выбора строк в правильном порядке.SQL Server обновляет таблицу на основе значений в одной таблице

Запрос, который я попробовал это следующим образом:

UPDATE myTable 
SET language = (SELECT language FROM myTable t2 
     WHERE t1.book = t2.book 
     AND t1.firstRun = t2.lastRun + 1) 
FROM myTable t1 
WHERE language = '--' 

Результатом является то, что я в конечном итоге с языком как NULL в нескольких случаях.

Моя таблица выглядит следующим образом:

book | firstRun | lastRun | language 
---------------------------------------------- 
b1  | 1   | 4   | English 
b1  | 5   | 9   | -- 
b1  | 10   | 25   | French 
b1  | 26   | 28   | -- 

Требуемая мощность:

book | firstRun | lastRun | language 
---------------------------------------------- 
b1  | 1   | 4   | English 
b1  | 5   | 9   | English 
b1  | 10   | 25   | French 
b1  | 26   | 28   | French 
+0

Возможно, и ваше заявление об обновлении кажется мне удобным. Вероятно, вы получаете нули в строках, которые не соответствуют подзапросу. –

+2

Ваш запрос на обновление работает нормально, как сказал @ZoharPeled. http://www.sqlfiddle.com/#!3/e0194/1/0 – FutbolFan

+0

Благодарим за отзыв. Он работает для маленькой игрушечной таблицы, как это. Но я нахожу, что на моей большой таблице, где порядок строк может быть другим, он не обновляет строки правильно. Некоторые строки оставлены как '-' – ame

ответ

0

Вы можете включать некоторые строки результата, где язык заканчивается как NULL? А также как выглядели эти строки раньше?

Чтобы закончить как NULL, JOIN, в подзапросе, должен был бы создать 0 строк или что уже есть строки в 'myTable', где язык IS NULL.

P.S. Легче, когда вы отступаете и очищаете свой код:

UPDATE 
    myTable 
SET 
    myTable.language = t2.language 
FROM 
    myTable t2 
WHERE 
    myTable.language = '--' AND 
    myTable.book  = t2.book AND 
    myTable.firstRun = t2.lastRun + 1 
+0

Это выглядит намного чище, спасибо! – ame