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

Откуда:
Сообщений: 5
Добрый день. Возник вопрос по написанию сложного UPDATE.

Имеется 3 таблицы: SC_PLEDGE_OWNER, SC_PLEDGE_IMMOVABLES, SC_PLEDGE
Нужно перенести определенные данные из SC_PLEDGE_IMMOVABLES в SC_PLEDGE_OWNER c только для тех записей в для которых поле SC_PLEDGE_OWNER.ORD_ID = SC_PLEDGE.ID_DEPOSITOR
В таблице SC_PLEDGE_OWNER уже есть заполненные столбцы, к ним добавлены новые, соответствующие столбцам из SC_PLEDGE_IMMOVABLES

Никак не получается связать все три таблицы чтобы, данные правильно переносились. Вот запрос который я написал:
UPDATE 
( 
 SELECT 
        SCPO.CERTIFICATE cer_new, 
        SCPO.CERTIFICATE_DATE cer_date_new, 
        SCPO.BASE_LAW base_law_new, 
        SCPO.BASE_LAW_DATE base_date_new, 
        SCPO.BASE_LAW_VALUE base_value_new, 
        SCPO.TYPE_LAW type_law_new, 
        SCPO.CHARGE charge_new, 
        SCPI.CERTIFICATE cer_old, 
        SCPI.CERTIFICATE_DATE cer_date_old, 
        SCPI.BASE_LAW base_law_old, 
        SCPI.BASE_LAW_DATE base_date_old, 
        SCPI.BASE_LAW_VALUE base_value_old, 
        SCPI.TYPE_LAW type_law_old, 
        SCPI.CHARGE charge_old 
 FROM SC_PLEDGE_OWNER scpo, SC_PLEDGE_IMMOVABLES scpi, SC_PLEDGE scp 
 WHERE SCPI.PLEDGE_ID = SCPO.PLEDGE_ID AND SCP.ID = SCPI.PLEDGE_ID AND SCP.DEPOSITOR_ID AND SCPO.ORG_ID 
) xx 
SET  
    xx.cer_new = xx.cer_old, 
    xx.cer_date_new = xx.cer_date_old, 
    xx.base_law_new = xx.base_law_old, 
    xx.base_date_new = xx.base_date_old, 
    xx.base_value_new = xx.base_value_old, 
    xx.type_law_new = xx.type_law_old, 
    xx.charge_new = xx.charge_old   


Но тут такая ошибка:
 [Error]Execution (22: 89): ORA-00920: неверен реляционный оператор

Конечно, правильнее использовать INNER JOIN, но я никак не могу правильно связать три таблицы.

Приму любую помощь, заранее спасибо.
27 янв 15, 14:18    [17176630]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE: Сложный UPDATE  [new]
123йй
Member

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

 WHERE SCPI.PLEDGE_ID = SCPO.PLEDGE_ID AND SCP.ID = SCPI.PLEDGE_ID AND SCP.DEPOSITOR_ID AND SCPO.ORG_ID 
27 янв 15, 14:25    [17176669]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE: Сложный UPDATE  [new]
roadster
Member [заблокирован]

Откуда: "Церковь тяжеловооружённого Христа" ©
Сообщений: 52495
Dr_Jakero
ORA-00920: неверен реляционный оператор
что возвращает твой селект?
азбука
UPDATE statement
Syntax
{
UPDATE table-Name [[AS] correlation-Name]
SET column-Name = Value
[ , column-Name = Value} ]*
[WHERE clause] |
UPDATE table-Name
SET column-Name = Value
[ , column-Name = Value ]*
WHERE CURRENT OF
}
27 янв 15, 14:35    [17176766]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE: Сложный UPDATE  [new]
Melkomyagkii_newbi
Member

Откуда: из прошлого
Сообщений: 1863
roadster,

А у меня в тоаде работает апдейт над селектом, а в sql девелопере нет.

ТС, ошибка в селекте по крайней мере, как 123йй и написал.
27 янв 15, 14:47    [17176897]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE: Сложный UPDATE  [new]
Dr_Jakero
Member

Откуда:
Сообщений: 5
Решил проблему таким способом:
UPDATE
(
 SELECT
        SCPO.CERTIFICATE cer_new,
        SCPO.CERTIFICATE_DATE cer_date_new,
        SCPO.BASE_LAW base_law_new,
        SCPO.BASE_LAW_DATE base_date_new,
        SCPO.BASE_LAW_VALUE base_value_new,
        SCPO.TYPE_LAW type_law_new,
        SCPO.CHARGE charge_new,
        SCPI.CERTIFICATE cer_old,
        SCPI.CERTIFICATE_DATE cer_date_old,
        SCPI.BASE_LAW base_law_old,
        SCPI.BASE_LAW_DATE base_date_old,
        SCPI.BASE_LAW_VALUE base_value_old,
        SCPI.TYPE_LAW type_law_old,
        SCPI.CHARGE charge_old,
        SCP.DEPOSITOR_ID depositor,
        SCPO.ORG_ID orgid
 FROM SC_PLEDGE_OWNER scpo
 INNER JOIN SC_PLEDGE_IMMOVABLES scpi ON SCPI.PLEDGE_ID = SCPO.PLEDGE_ID
 INNER JOIN SC_PLEDGE scp ON SCP.ID = SCPO.PLEDGE_ID
) xx
SET 
    xx.cer_new = xx.cer_old,
    xx.cer_date_new = xx.cer_date_old,
    xx.base_law_new = xx.base_law_old,
    xx.base_date_new = xx.base_date_old,
    xx.base_value_new = xx.base_value_old,
    xx.type_law_new = xx.type_law_old,
    xx.charge_new = xx.charge_old
WHERE xx.orgid = xx.depositor


Но возник вопрос как будет выглядеть данный запрос, а если потребуется реализовать такой UPDATE с помощью MERGE, т.е. если xx.orgid = xx.depositor он не нашел таких записей, и вставить новую.
MERGE поддерживает вставку сразу из нескольких таблиц? В данном случае здесь будет в таблицу SC_PLEDGE_OWNER вставляться почти все поля из SC_PLEDGE_IMMOVABLES и одно поле из SC_PLEDGE.
27 янв 15, 15:14    [17177211]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE: Сложный UPDATE  [new]
Melkomyagkii_newbi
Member

Откуда: из прошлого
Сообщений: 1863
Dr_Jakero,

мог просто удалить подсвеченное красненьким получается
123йй
Dr_Jakero,

 WHERE SCPI.PLEDGE_ID = SCPO.PLEDGE_ID AND SCP.ID = SCPI.PLEDGE_ID AND SCP.DEPOSITOR_ID AND SCPO.ORG_ID 


Dr_Jakero

Но возник вопрос как будет выглядеть данный запрос, а если потребуется реализовать такой UPDATE с помощью MERGE, т.е. если xx.orgid = xx.depositor он не нашел таких записей, и вставить новую.
MERGE поддерживает вставку сразу из нескольких таблиц? В данном случае здесь будет в таблицу SC_PLEDGE_OWNER вставляться почти все поля из SC_PLEDGE_IMMOVABLES и одно поле из SC_PLEDGE.


не, не поддерживает. Наверно можно через updatable view как-то обойти - не пробовал.
27 янв 15, 15:34    [17177403]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE: Сложный UPDATE  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
Dr_Jakero,
MERGE поддерживает вставку из запроса, поэтому объединив SC_PLEDGE_IMMOVABLES и SC_PLEDGE ты решишь свою задачу. Только SC_PLEDGE_OWNER в объединение не включай.
27 янв 15, 15:36    [17177419]     Ответить | Цитировать Сообщить модератору
 Re: ORACLE: Сложный UPDATE  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
Melkomyagkii_newbi
Dr_Jakero,

не, не поддерживает. Наверно можно через updatable view как-то обойти - не пробовал.


Нет, поддерживает. В USES можно объединять таблицы, прикинь!
27 янв 15, 15:49    [17177566]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить