обновить каждую строку в процедуре - PullRequest
1 голос
/ 10 ноября 2009

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

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

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

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

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

if (table1.document = view1.document)
затем table1.field1 = view1.bus

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2009

Это можно сделать с помощью простого 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
1 голос
/ 10 ноября 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 может иметь несколько строк для данного значения [DOCUMENT] строки TABLE1, то значение [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.

...