CftClub.ru
Клуб специалистов ЦФТ-Банк

UPDATE (SELECT

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы
Предыдущая тема :: Следующая тема  
Автор Сообщение
mx1234567
Участник со стажем


Вступление в Клуб: 18.11.2010
СообщениеПт Июн 08, 2018 21:03   UPDATE (SELECT Ответить с цитатой
Полезность: Нет оценки
Как на PL+ написать подобное?

Код:

UPDATE (SELECT t1.id,
               t1.name name1,
               t1.desc desc1,
               t2.name name2,
               t2.desc desc2
          FROM table1 t1,
               table2 t2
         WHERE t1.id = t2.id)
   SET name1 = name2,
       desc1 = desc2
RustamR
Участник


Вступление в Клуб: 26.04.2018
СообщениеСб Июн 09, 2018 01:39    Ответить с цитатой
Полезность: Нет оценки
Первый попавшися из поиска по операциям:
Код:

update x(x.[PRODUCT_CT].[ACC_PROD]    = null
   ,x.[PRODUCT_CT].[ACC_DOC]    = null
   ,x.[PRODUCT_CT].[FACT_OPER] = null
) in ::[MAIN_DOCUM] all
where x = MDoc.Id;   
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеСб Июн 09, 2018 02:33    Ответить с цитатой
Полезность: Нет оценки
RustamR пишет:
Первый попавшися из поиска по операциям:
Код:

update x(x.[PRODUCT_CT].[ACC_PROD]    = null
   ,x.[PRODUCT_CT].[ACC_DOC]    = null
   ,x.[PRODUCT_CT].[FACT_OPER] = null
) in ::[MAIN_DOCUM] all
where x = MDoc.Id;   


Вопрос был не про простой update таблицы, а про update по select двух связанных таблиц (причём связь не родитель- дочерний класс)
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеСб Июн 09, 2018 11:07   Re: UPDATE (SELECT Ответить с цитатой
Полезность: Нет оценки
mx1234567 пишет:
Как на PL+ написать подобное?

Код:

UPDATE (SELECT t1.id,
               t1.name name1,
               t1.desc desc1,
               t2.name name2,
               t2.desc desc2
          FROM table1 t1,
               table2 t2
         WHERE t1.id = t2.id)
   SET name1 = name2,
       desc1 = desc2


Наверно никак

Только разворотом select и update вложенным в FOR, пример

::[SWIFT_MESSAGE].[TORG_ERROR_MES]



или обход table of, в который можно загрузить select-ом

for update пример

[BC_FAKTURA].[HANDLE_OUT]
Эмиралька
Эксперт


Вступление в Клуб: 09.11.2015
СообщениеПт Июн 22, 2018 09:16    Ответить с цитатой
Полезность: Нет оценки
mx1234567 пишет:
Код:

UPDATE (SELECT t1.id,
               t1.name name1,
               t1.desc desc1,
               t2.name name2,
               t2.desc desc2
          FROM table1 t1,
               table2 t2
         WHERE t1.id = t2.id)
   SET name1 = name2,
       desc1 = desc2


Alkov пишет:
RustamR пишет:
Первый попавшися из поиска по операциям:
Код:

update x(x.[PRODUCT_CT].[ACC_PROD]    = null
   ,x.[PRODUCT_CT].[ACC_DOC]    = null
   ,x.[PRODUCT_CT].[FACT_OPER] = null
) in ::[MAIN_DOCUM] all
where x = MDoc.Id;   


Вопрос был не про простой update таблицы, а про update по select двух связанных таблиц (причём связь не родитель- дочерний класс)


А оно так работает? Если не ошибаюсь, update (select ) и в Oracle работает с существенными ограничениями.
И второй вопрос - а зачем?
alyona_1989
Участник


Вступление в Клуб: 23.01.2020
СообщениеПн Ноя 23, 2020 11:54    Ответить с цитатой
Полезность: Нет оценки
Привет всем!

В общем есть вот такой update:


update --+ parallel(30) ENABLE_PARALLEL_DML
Z#KAS_DOC_ANALIT a1
set a1.c_id_quit_doc = (select b1.id from Z#KAS_TEMP_TABLE_B b1 where b1.c_s1 = a1.c_out_idx)
where exists (select 1 from Z#KAS_TEMP_TABLE_B b1 where b1.c_s1 = a1.c_out_idx);


Но по из-за условия = (select b1.id from Z#KAS_TEMP_TABLE_B b1 where b1.c_s1 = a1.c_out_idx) он нормально не распараллеливается как дмл.

Подскажите, возможно ли как-то ускорить этот запрос?

В таблице Z#KAS_DOC_ANALIT у меня порядка 20 млн записей, в Z#KAS_TEMP_TABLE у меня около 900 записей.

Если смотреть на план запроса, это обычный распараллеленный апдейт, но никак не дмл.
Эмиралька
Эксперт


Вступление в Клуб: 09.11.2015
СообщениеВт Ноя 24, 2020 09:30    Ответить с цитатой
Полезность: Нет оценки
Цитата:
Привет всем!

В общем есть вот такой update:


update --+ parallel(30) ENABLE_PARALLEL_DML
Z#KAS_DOC_ANALIT a1
set a1.c_id_quit_doc = (select b1.id from Z#KAS_TEMP_TABLE_B b1 where b1.c_s1 = a1.c_out_idx)
where exists (select 1 from Z#KAS_TEMP_TABLE_B b1 where b1.c_s1 = a1.c_out_idx);


Но по из-за условия = (select b1.id from Z#KAS_TEMP_TABLE_B b1 where b1.c_s1 = a1.c_out_idx) он нормально не распараллеливается как дмл.

Подскажите, возможно ли как-то ускорить этот запрос?

В таблице Z#KAS_DOC_ANALIT у меня порядка 20 млн записей, в Z#KAS_TEMP_TABLE у меня около 900 записей.

Если смотреть на план запроса, это обычный распараллеленный апдейт, но никак не дмл.


Я бы как минимум exists заменила на in
where a1.c_out_idx in (select b1.c_s1 from Z#KAS_TEMP_TABLE_B b1);
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru