Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как обновить таблицу по связке с другой?  [new]
beginner_dba
Member

Откуда: Киев
Сообщений: 331
Есть таблица 1
ID, NAME1, NAME2
Есть таблица 2
ID, NAME3

Как обновить поле NAME2 таблицы значениями NAME3 при совпадении ID обеих таблиц (совпадения уникальны, то есть 1 строка имеет только 1 строку совпадений в другой таблице.).
26 май 11, 12:28    [10712168]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
beginner_dba,

Либо merge либо update с подзапросом. Как то так.
26 май 11, 12:32    [10712207]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
SysOper
Member

Откуда: M
Сообщений: 9760
beginner_dba,

update table t1 set name2 = (select name3 from t2 where t1.id=t2.id)
where exists (select 1 from t2 where t1.id=t2.id);
или merge
26 май 11, 12:32    [10712213]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
beginner_dba
Member

Откуда: Киев
Сообщений: 331
Сергей Арсеньев
beginner_dba,

Либо merge либо update с подзапросом. Как то так.


В MS SQL Server я делал вот так:

update table1
set t1.name2=t2.name3
from table1 t1
left join table t2
on t1.id=t2.id

А как на PL/SQL?
26 май 11, 12:36    [10712238]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
SysOper
Member

Откуда: M
Сообщений: 9760
beginner_dba,

merge into t1 using t2
on t1.id=t2.id
when MATCHED THEN
update set t1.name2=t2.name3;
26 май 11, 12:45    [10712321]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
beginner_dba,

а left, это затем, чтобы занулить те, которых нет в t2? Тогда как тебе показали без условия на where exists.
26 май 11, 12:45    [10712325]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
beginner_dba
Member

Откуда: Киев
Сообщений: 331
SysOper
beginner_dba,

merge into t1 using t2
on t1.id=t2.id
when MATCHED THEN
update set t1.name2=t2.name3;



а так можно? Если у меня не таблица t2, а резальтсет запроса.

merge into t1 using (select id, name3 from t8) t2
on t1.id=t2.id
when MATCHED THEN
update set t1.name2=t2.name3
26 май 11, 12:49    [10712354]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
SysOper
Member

Откуда: M
Сообщений: 9760
beginner_dba,

Для Вас все, что угодно :)
26 май 11, 12:52    [10712378]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
beginner_dba
Member

Откуда: Киев
Сообщений: 331
SysOper
beginner_dba,

Для Вас все, что угодно :)


merge into clients t1 using (select cl1_id, cl1_idcity from (select cl1.id cl1_id, cl1.city cl1_city , cl1.b_city cl1_b_city, c1.name c1_name, cl1.region cl1_region, c1.id cl1_idcity
from clients cl1
left join citys c1 on c1.name=upper(cl1.b_city)
and c1.region=cl1.region
where c1.name is not null
and cl1.id in (
select cl_id from (select cl_id, count(cl_id) from (select cl.id cl_id, cl.city cl_city , cl.b_city cl_b_city, c.name c_name, cl.region cl_region
from clients cl
left join citys c on c.name=upper(cl.b_city)
and c.region=cl.region
where c.name is not null) prep
group by cl_id
having count(cl_id)=1)))) t2
on t1.id=t2.cl1_id
when MATCHED THEN
update set t1.city=t2.cl1_idcity;

Выдает ошибку ORA-00969: missing ON keyword
26 май 11, 12:56    [10712402]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
beginner_dba
В MS SQL Server я делал вот так:

update table1
set t1.name2=t2.name3
from table1 t1
left join table t2
on t1.id=t2.id

А как на PL/SQL?

PL/SQL - императивный язык, на нем запросы не пишутся.
А на oracle-вом диалекте SQL update соединения делается точно так же, если задекларированы и выполнены условия key-preserved (ключевое слово для поиска в доке)
26 май 11, 12:56    [10712403]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
beginner_dba
Member

Откуда: Киев
Сообщений: 331
andrey_anonymous
beginner_dba
В MS SQL Server я делал вот так:

update table1
set t1.name2=t2.name3
from table1 t1
left join table t2
on t1.id=t2.id

А как на PL/SQL?

PL/SQL - императивный язык, на нем запросы не пишутся.
А на oracle-вом диалекте SQL update соединения делается точно так же, если задекларированы и выполнены условия key-preserved (ключевое слово для поиска в доке)


update gd.clients
set t1.city=t2.cl1_idcity
from gd.clients t1 
left join (
select cl1_id, cl1_idcity from (select cl1.id cl1_id, cl1.city cl1_city , cl1.b_city cl1_b_city, c1.name c1_name, cl1.region cl1_region, c1.id cl1_idcity
from clients cl1
left join citys c1 on c1.name=upper(cl1.b_city)
and c1.region=cl1.region
where c1.name is not null
and cl1.id in (
select cl_id from (select cl_id, count(cl_id) from (select cl.id cl_id, cl.city cl_city , cl.b_city cl_b_city, c.name c_name, cl.region cl_region
from clients cl
left join citys c on c.name=upper(cl.b_city)
and c.region=cl.region
where c.name is not null) prep
group by cl_id
having count(cl_id)=1)))) t2
on t1.id=t2.cl1_id;

ORA-00933: SQL command not properly ended
26 май 11, 13:03    [10712449]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
beginner_dba,

имелось ввиду что, в качестве таблицы приемника можно, иногда указывать join view.
Синтаксиса update from в оракле нет. Вместо этого merge.
Проверьте свой подзапрос отдельно - он работает?
26 май 11, 13:08    [10712474]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
beginner_dba
Member

Откуда: Киев
Сообщений: 331
Сергей Арсеньев
beginner_dba,

имелось ввиду что, в качестве таблицы приемника можно, иногда указывать join view.
Синтаксиса update from в оракле нет. Вместо этого merge.
Проверьте свой подзапрос отдельно - он работает?


select cl1_id, cl1_idcity from (select cl1.id cl1_id, cl1.city cl1_city , cl1.b_city cl1_b_city, c1.name c1_name, cl1.region cl1_region, c1.id cl1_idcity
from clients cl1
left join citys c1 on c1.name=upper(cl1.b_city)
and c1.region=cl1.region
where c1.name is not null
and cl1.id in (
select cl_id from (select cl_id, count(cl_id) from (select cl.id cl_id, cl.city cl_city , cl.b_city cl_b_city, c.name c_name, cl.region cl_region
from clients cl
left join citys c on c.name=upper(cl.b_city)
and c.region=cl.region
where c.name is not null) prep
group by cl_id
having count(cl_id)=1)));

Да он выдает результат
26 май 11, 13:09    [10712485]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
beginner_dba,

on ( condition ) помогает?
26 май 11, 13:12    [10712507]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу по связке с другой?  [new]
beginner_dba
Member

Откуда: Киев
Сообщений: 331
SysOper
beginner_dba,

update table t1 set name2 = (select name3 from t2 where t1.id=t2.id)
where exists (select 1 from t2 where t1.id=t2.id);
или merge



update gd.clients t1 set city = (select cl1_idcity from  (select cl1_id, cl1_idcity from (select cl1.id cl1_id, cl1.city cl1_city , cl1.b_city cl1_b_city, c1.name c1_name, cl1.region cl1_region, c1.id cl1_idcity
from clients cl1
left join citys c1 on c1.name=upper(cl1.b_city)
and c1.region=cl1.region
where c1.name is not null
and cl1.id in (
select cl_id from (select cl_id, count(cl_id) from (select cl.id cl_id, cl.city cl_city , cl.b_city cl_b_city, c.name c_name, cl.region cl_region
from clients cl
left join citys c on c.name=upper(cl.b_city)
and c.region=cl.region
where c.name is not null) prep
group by cl_id
having count(cl_id)=1)))) t2 where t1.id=t2.cl1_id)
where exists (select 1 from (select cl1_id, cl1_idcity from (select cl1.id cl1_id, cl1.city cl1_city , cl1.b_city cl1_b_city, c1.name c1_name, cl1.region cl1_region, c1.id cl1_idcity
from clients cl1
left join citys c1 on c1.name=upper(cl1.b_city)
and c1.region=cl1.region
where c1.name is not null
and cl1.id in (
select cl_id from (select cl_id, count(cl_id) from (select cl.id cl_id, cl.city cl_city , cl.b_city cl_b_city, c.name c_name, cl.region cl_region
from clients cl
left join citys c on c.name=upper(cl.b_city)
and c.region=cl.region
where c.name is not null) prep
group by cl_id
having count(cl_id)=1)))) t2 where t1.id=t2.cl1_id);

вот это сработало
26 май 11, 13:20    [10712570]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить