Обновить значение из оператора выбора - PullRequest
0 голосов
/ 19 июля 2010

Я использую систему баз данных Access over Oracle (в основном использую Access для форм и получаю таблицы с помощью кода ADO) и пытаюсь обновить поле в таблице продукта значением того же именованного поля взагрузить таблицу.Я использую код:

.CommandText = "UPDATE " & strSchema & ".TBL_CAPITAL_MGMT_PRODUCT a INNER JOIN " & strSchema & ".TBL_CAPITAL_MGMT_TEMP_LOAD b ON a.AR_ID = b.AR_ID SET a.TOT_RWA_AMT = b.TOT_RWA_AMT;"

, который возвращает ошибку об отсутствующем ключевом слове SET. Поэтому я изменил его на:

.CommandText = "UPDATE (SELECT a.TOT_RWA_AMT, b.TOT_RWA_AMT As New_RWA_AMT FROM " & strSchema & ".TBL_CAPITAL_MGMT_TEMP_LOAD a INNER JOIN " & strSchema & ".TBL_CAPITAL_MGMT_PRODUCT b ON b.AR_ID = a.AR_ID Where a.New_Rec <> '-1' AND a.IP_ID Is Not Null) c SET c.New_RWA_AMT = c.TOT_RWA_AMT;"

, который возвращает ошибку о незарезервированном ключеТаблица.таблица b имеет pk AR_ID, но таблица не имеет первичного ключа и, вероятно, не получит его, я не могу обновить структуру любой из таблиц.

Я пытался использовать /* + BYPASS_UJVC * / который позволяет запускать код, но на самом деле ничего не делает.

У кого-нибудь есть идеи, куда мне отсюда идти?

Спасибо

Alex

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Если вы используете Oracle 10g или выше, альтернативой решению Тони будет использование оператора MERGE только с предложением MATCHED.

MERGE INTO TBL_CAPITAL_MGMT_PRODUCT a
   USING TBL_CAPITAL_MGMT_TEMP_LOAD b
   ON (a.AR_ID = b.AR_ID)
WHEN MATCHED THEN
   UPDATE SET a.TOT_RWA_AMT = b.TOT_RWA_AMT;
2 голосов
/ 19 июля 2010

Игнорируя нерелевантный код ADO, вы пытаетесь сделать следующее обновление:

UPDATE TBL_CAPITAL_MGMT_PRODUCT a 
INNER JOIN 
SET a.TOT_RWA_AMT = b.TOT_RWA_AMT;

Это не поддерживается Oracle (хотя, возможно, эта недокументированная подсказка BYPASS_UJVC должна преодолеть это, но я не былне знаю об этом до сих пор).

Учитывая, что ваша версия встроенного представления не работает из-за отсутствия ограничений, вам, возможно, придется прибегнуть к традиционному подходу Oracle с использованием коррелированных подзапросов:

UPDATE TBL_CAPITAL_MGMT_PRODUCT a 
SET a.TOT_RWA_AMT = (SELECT b.TOT_RWA_AMT 
                       FROM TBL_CAPITAL_MGMT_TEMP_LOAD b
                      WHERE a.AR_ID = b.AR_ID
                    )
WHERE EXISTS (SELECT NULL 
                FROM TBL_CAPITAL_MGMT_TEMP_LOAD b
               WHERE a.AR_ID = b.AR_ID
             );    

Заключительное предложение WHERE - запретить установку значения TOT_RWA_AMT в NULL в любых строках "a", в которых нет соответствующей строки "b".Если вы знаете, что этого никогда не произойдет, вы можете удалить предложение WHERE.

...