Oracle: обновление на основе условия

#sql #oracle #sql-update

#sql #Oracle #sql-обновление

Вопрос:

Я хочу обновить столбец таблицы на основе условия. Он должен проверить, существует ли значение в другой таблице, если существует, то будет использоваться значение из другой таблицы, иначе будет использоваться значение из той же таблицы.

 Update table1
Set column1=(select t2.alias||@email.com’ as new_name
From table2 t2, table1 t1, table3 t3
Where t1.id=t2.id
And t1.id=t3.id

Else if
Select t2.alias is null or t2.id is null 
then column1= select t1.id||@email.com’ as new_name 
  

Есть предложения по этому поводу??

Заранее спасибо.

Ответ №1:

Делает ли это то, что вы хотите?

 Update table1
Set column1 = (select (case when t2.alias is not null and t2.id is not null then t2.alias
                            else t1.id
                       end) ||'@email.com' as new_name
               From table1 t1 left outer join
                    table2 t2
                    on t1.id=t2.id
              );
  

Я удалил table3 , потому что, похоже, он не используется. С left join помощью is даже не будет фильтровать какие-либо результаты.

Ответ №2:

Пропустив половину инструкции «вставить» merge , вы можете превратить ее в строгий update оператор:

 MERGE INTO table1 t
USING(
  SELECT t2.id, t2.Alias
  FROM   table2 t2
  JOIN   table1 t1
    ON   t1.id = t2.id
    AND  t1.Alias <> t2.Alias
) tu
on( tu.id = t.id )
WHEN MATCHED THEN
  update set t.Alias = tu.Alias;
  

Запрос вернет только те существующие значения из таблицы2, которые отличаются от таблицы1. Чтобы оно точно соответствовало вашему требованию (обновите table1, если какое-либо значение существует в table2), затем удалите строку AND t1.Alias <> t2.Alias , но зачем обновлять поле до того же значения, которое оно уже имеет?