2015-07-20 2 views
1

Я получаю эту ошибку при запуске моего MERGE заявление:MERGE заявление ОШИБКИ

Error report - 
SQL Error: ORA-00904: "SRC"."TB2"."WAERS": invalid identifier 
00904. 00000 - "%s: invalid identifier". 

Это мое заявление:

MERGE INTO costing. TB1 USING 
(SELECT costing.TB1.ROWID row_id, 
     costing.TB2.WAERS 
    FROM costing.TB2 
    JOIN costing.TB3 
    ON costing.TB2.BUKRS = costing.TB3.BUKRS 
    JOIN costing.TB1 
    ON costing.TB3.MANDT = Client 
    AND costing.TB3.BWKEY = costing.TB1.Plant 
    WHERE Currency_Conversion_Status <> 'Pricing Missing' 
) src ON (costing.TB1.ROWID = src.row_id) 
WHEN MATCHED THEN 
    UPDATE SET Currency = src.TB2.WAERS; 

ответ

1

Вы пытаетесь использовать псевдонимы, которые вы определили в Src подзапроса вне подзапрос. Это никогда не сработает.

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

merge into costing.tb1 tgt 
using (select t1.rowid row_id, 
       t2.waers 
     from costing.tb2 t2 
       join costing.tb3 t3 on t2.bukrs = t3.bukrs 
       join costing.tb1 t1 on t3.mandt = client -- missing alias on client 
            and t3.bwkey = t1.plant 
     where currency_conversion_status <> 'Pricing Missing' -- missing alias on currency_conversion_status 
    ) src 
    on (tgt.rowid = src.row_id) 
when matched then 
    update set tgt.currency = src.waers; 

Я бы посоветовал вам добавить недостающие псевдонимы от клиента и currency_conversion_status, так что вы можете указать, к каким таблицам они принадлежат.

Если клиент представляет собой столбец в costing.tb1, то возможно, вам не нужно включать присоединитесь к ТВ1 в подзапроса, вы можете просто присоединиться к нему непосредственно в операторе MERGE, что-то вроде:

merge into costing.tb1 tgt 
using (select t3.mandt, 
       t3.bwkey, 
       t2.waers 
     from costing.tb2 t2 
       join costing.tb3 t3 on t2.bukrs = t3.bukrs 
     where currency_conversion_status <> 'Pricing Missing' -- missing alias on currency_conversion_status 
    ) src 
    on (tgt.client = src.mandt 
     and tgt.plant = src.bwkey) 
when matched then 
    update set tgt.currency = src.waers; 

Хотя, поскольку я не знаю, к какой таблице принадлежит currency_conversion_status, вам, возможно, придется перемещаться туда, куда идет предложение where.

Делая это, вы удаляете ненужное соединение в таблицу costing.tb1, что должно улучшить производительность оператора.

+0

он показывает недопустимый идентификатор, если я добавляю псевдоним tgt в currency_conversion_status. – param

+0

Эта колонка находится в tb1? Если это так, переместите это где к внешнему запросу (то есть набор обновлений ... где ...) – Boneist

+0

да, это сработало ... :) .. спасибо – param

Смежные вопросы