Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2015, 14:05   #1
Dr_Jakero
Пользователь
 
Регистрация: 13.11.2014
Сообщений: 12
Восклицание ORACLE: Сложный UPDATE

Добрый день. Возник вопрос по написанию сложного 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

Никак не получается связать все три таблицы чтобы, данные правильно переносились. Вот запрос который я написал:
PHP код:
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 scpiSC_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, но я никак не могу правильно связать три таблицы.

Приму любую помощь, заранее спасибо.
Dr_Jakero вне форума Ответить с цитированием
Старый 27.01.2015, 14:09   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
UPDATE
(
SELECT
Э-э-э... А разве UPDATE поддерживает редактирование одноразовых курсоров?
И потом, перенос это же INSERT?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.01.2015, 14:13   #3
Dr_Jakero
Пользователь
 
Регистрация: 13.11.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Э-э-э... А разве UPDATE поддерживает редактирование одноразовых курсоров?
И потом, перенос это же INSERT?
В таблице SC_PLEDGE_OWNER уже существуют заполненные столбцы, а именно ID и ORG_ID(организация). К ним добавлены столбцы соответствующие столбцам из таблицы
SC_PLEDGE_IMMOVABLES.
Dr_Jakero вне форума Ответить с цитированием
Старый 27.01.2015, 14:59   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Так тогда так:
Код:
UPDATE SC_PLEDGE_OWNER
SET  
    cer_new = xx.cer_old, 
    cer_date_new = xx.cer_date_old, 
    base_law_new = xx.base_law_old, 
    base_date_new = xx.base_date_old, 
    base_value_new = xx.base_value_old, 
    type_law_new = xx.type_law_old, 
    charge_new = xx.charge_old 
from (
 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
where SC_PLEDGE_OWNER=xx.ID_DEPOSITOR
получается...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.01.2015, 15:06   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Для начала убрал бы везде псевдоним xx. Он и для вложенного не нужен, а уж в левых частях присваивания в set и подавно
Цитата:
Так тогда так
Oracle как бэ позволяет и так как у ТС. А вот с FROM по моему нет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 27.01.2015 в 15:11.
Аватар вне форума Ответить с цитированием
Старый 27.01.2015, 15:09   #6
Dr_Jakero
Пользователь
 
Регистрация: 13.11.2014
Сообщений: 12
По умолчанию

Спасибо, я тоже решил проблему, только чуть-чуть другим способом, но твой также хорош.
Мой вариант:
PHP код:
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 
Dr_Jakero вне форума Ответить с цитированием
Старый 27.01.2015, 19:54   #7
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Сообщение от Dr_Jakero Посмотреть сообщение
Спасибо, я тоже решил проблему
Ну вот, а я хотел на merge советовать переписать. У него логика как-то прозрачней.
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Oracle, сложный запрос, помогите. Dr_Jakero SQL, базы данных 13 01.12.2014 10:37
Oracle+Delphi хранение процедур на Update xxbesoxx БД в Delphi 16 20.09.2013 17:17
NEW значение в UPDATE триггере Oracle Raz0r SQL, базы данных 7 07.11.2012 20:15
сложный SQL update luiszevs SQL, базы данных 4 18.12.2011 13:53