Каков наилучший способ выполнить несколько операций в одном операторе в обновлении, я хочу, например, обновить столбец поля таблицы nr3.

Create table nr1
(
id int,
price int,
price2 int,
PRIMARY KEY (id)
);

create table nr2 
(id int,
salary int
PRIMARY KEY (id)
);

create table nr3
(id int,
id1 int,
id2 int,
value int,
field int,
PRIMARY KEY (id),
FOREIGN KEY (id1) REFERENCES nr1(id),
FOREIGN KEY (id2) REFERENCES nr2(id)
);

И например я хочу сделать операцию

nr3.field= ((nr1.price+nr1.price2)* nr2.salary)/nr3.value;

Как сделать это наилучшим образом, мне нужен какой-то шаблон, потому что я думаю, что не понимаю, можно сделать это в одном UPDATE или мне нужно сделать какие-то другие «временные» столбцы?

0
Potato 21 Июн 2018 в 15:41

1 ответ

Лучший ответ

Предполагая, что столбец id - это то, что связывает nr2 и nr1 с nr3 (и что столбец id уникален в каждой таблице), возможно, это то, что вам нужно:

update nr3
set    nr3.field = ((select nr1.price + nr1.price2 from nr1 where nr1.id1 = nr3.id)
                    * (select nr2.salary from nr2 where nr2.id = nr3.id2))
                   / nr3.value;

В качестве альтернативы, инструкция MERGE может быть более полезной, если предположить, что nr1.id и nr2.id одинаковы:

merge into nr3 tgt
  using (select nr1.id,
                (nr1.price + nr1.price2) * nr2.salary new_val
         from   nr1
                inner join nr2 on nr1.id = nr2.id) src
  on (tgt.id = src.id)
when matched then
  update set tgt.field = src.new_val / tgt.value;

Однако, исходя из ваших правок в таблице nr3, может быть небезопасно предполагать, что nr1.id = nr2.id. Если это так, придерживайтесь приведенного выше оператора update, иначе вам нужно будет включить nr3 в подзапрос src, что означает дополнительное соединение в таблице. Это могло быть менее эффективным, чем соответствующий оператор обновления.

1
Boneist 21 Июн 2018 в 13:12