обновить каждую строку в процедуре

У меня есть следующие данные в таблице TABLE1

ДОКУМЕНТ ------ ПОЛЕ1
12345
23456
34567
45678
98765

у меня есть следующие данные в представлении VIEW1

ДОКУМЕНТ ---- АВТОБУС
12345 ------------ 5
23456 ------------ 6
34567 ------ ------ 8
45678 ------------ 12
98765 ------------ 14

Что я хотел бы сделать, это обновить каждую строку

если (table1.document = view1.document)
then table1.field1 = view1.bus

Любое понимание поможет.

Спасибо.


person user207902    schedule 10.11.2009    source источник


Ответы (2)


Это можно сделать с помощью простого SQL, никаких процедур не требуется:

UPDATE table1 SET field1 = (SELECT bus FROM view1 WHERE table1.document = view1.document)

Или, если ваша база данных позволяет это:

UPDATE (select table1.field1, view1.bus FROM table1 JOIN view1 ON table1.document = view1.document) SET table1.field1 = view1.bus
person Dan    schedule 10.11.2009
comment
Спасибо. Я пробовал «для каждой строки» выбирать разные пункты обновления. ничего не работало. Большое спасибо. - person user207902; 10.11.2009

Как сказал Дэн, но в MS SQL Server мне легче читать этот стиль:

UPDATE U
SET U.field1 = V.bus 
FROM table1 AS U
    JOIN view1 AS V
       ON V.document = U.document

Обратите внимание, что если VIEW1 может иметь несколько строк для данного значения строки TABLE1 [DOCUMENT], тогда значение [BUS], выбранное для обновления TABLE1, будет случайным в пределах соответствующего набора. (В этом случае запрос можно изменить, чтобы выбрать MAX / MIN / и т. д.)

Я бы уточнил этот запрос, чтобы НЕ обновлять строки, которые уже соответствуют значению BUS, что ускорит его, если он будет повторно запущен, и, следовательно, некоторые значения уже существуют в TABLE1.

UPDATE U
SET U.field1 = V.bus 
FROM table1 AS U
    JOIN view1 AS V
       ON V.document = U.document
WHERE    U.field1 = V.bus
      OR (U.field1 IS NOT NULL AND V.bus IS NULL)
      OR (U.field1 IS NULL AND V.bus IS NOT NULL)

вы можете пропустить тесты NULL / NOT NULL, если поле определено как не допускающее NULL.

person Kristen    schedule 10.11.2009
comment
Это недопустимый синтаксис на сервере sql. Вы проверили это? проверьте правильный здесь stackoverflow.com/a/21000449/4795214 (короче говоря: вы не можете использовать псевдоним U в первом строка, вы ДОЛЖНЫ повторить table1) - person ; 13.12.2015
comment
Это не так, вы проверяли это? Вы определенно можете выполнить UPDATE AliasName SET... FROM MyTable AS AliasName в SQL Server — ссылка на DOC: msdn.microsoft.com/en-us/library/ms177523.aspx - person Kristen; 12.07.2016
comment
Да, это правильно. Я проверил это. Пожалуйста, отредактируйте свой ответ, чтобы я мог удалить свой отрицательный голос :) - person ; 13.07.2016
comment
Либо я неправильно понимаю ваше описание, либо вы не правы. Вот пример ОБНОВЛЕНИЯ с использованием псевдонима, согласно документам CREATE TABLE table1 (ID int, field1 varchar(10)); ВСТАВИТЬ В таблицу1 VALUES(1, 'xxx'); UPDATE U SET field1 = 'YYY' FROM table1 AS U; ВЫБЕРИТЕ * ИЗ таблицы1; - person Kristen; 13.07.2016
comment
Под моим предыдущим комментарием я подразумеваю, что вы правы, а я ошибался :), и я прошу вас отредактировать свой ответ, чтобы я мог удалить свой глупый отрицательный голос :) - person ; 13.07.2016
comment
Ах, теперь я понял, извините. Я не осознавал, что мне пришлось внести (NULL) редактирование в свой пост, чтобы вы могли изменить свой голос ... это не кажется очень умным, конечно, если вы передумаете, вам должно быть разрешено изменить свой голос ! Я отредактировал свой ответ :) - person Kristen; 13.07.2016
comment
Это действительно нехорошо. Я думаю, нам нужно представить эту проблему в метаданных stackoverflow. - person ; 14.07.2016