2013-02-20 5 views
0

Я пытаюсь написать инструкцию UPDATE с инструкцией SELECT в ORACLE, но я все время получал ошибку «недопустимый идентификатор». Я уверен, что поле существует.Оператор UPDATE с SELECT

Это мой SQL:

update 
(
select distinct a.item_id, a.account_code, b.item_id, b.account_code 
from bp.poline a, mt.material b 
where a.item_id = b.item_id 
and a.account_code is not null and b.account_code is null 
) 
set b.account_code = a.account_code 

И это ошибка, что я получаю:

Error report: 
SQL Error: ORA-00904: "A"."ACCOUNT_CODE": invalid identifier 
00904. 00000 - "%s: invalid identifier 
+1

Не это означает, что ' account_code' не является полем в вашем псевдониме 'a'? –

+0

account_code существует в a. Я это проверил. – cooldude

+1

См. Этот вопрос: [Oracle - инструкция обновления с внутренним соединением] (http://stackoverflow.com/q/2446764/851811). –

ответ

0

использовать обновление заявление с выбрать заявление в SQL ниже является синтаксис ... и его работа в моем коде в этом я использую производную таблицу может быть, это vl поможет вам

напр ....

ОБНОВЛЕНИЕ SHIFT_MST SET SHIFT_MST.SHIFT_DESC = A.SHIFT_DESC, SHIFT_MST.SHIFT_CODE = A.SHIFT_CODE от

(ВЫБОР * ОТ TEMP_SHIFT_MST) а

где a.SHIFT_ID = SHIFT_MST.SHIFT_ID

+0

Будет ли это работать в ORACLE? Я на ORACLE, а не MSSQL – cooldude

+0

ПРОВЕРЬТЕ ЭТУ ЛИНИЮ ЭТО ПОМОЧЬ ВАМ http://dba.stackexchange.com/questions/3033/how-to-update-a-table-from-a-another-table – user1102001

4

В Oracle вы можете обновить подзапрос уплотнительное если Oracle сможет точно определить одну и ту же строку базовой таблицы для каждой строки подзапроса. Кроме того, additional restrictions apply относительно использования функции аналитика, агрегатов и т.д.

В вашем примере DISTINCT сделает Oracle удалось обновить вложенный запрос, потому что один строка подзапроса может указывать на несколько строк базовой таблицы ,

Если удалить DISTINCT, запрос будет работать, только если есть уникальный индекс на MATERIAL(item_id) так, что каждая строка в таблице POLINE могут быть связаны только с не более одной строки в MATERIAL:

UPDATE (SELECT a.item_id, a.account_code acct_a, 
       b.item_id, b.account_code acct_b 
      FROM bp.poline a, mt.material b 
     WHERE a.item_id = b.item_id 
      AND a.account_code IS NOT NULL 
      AND b.account_code IS NULL) 
    SET acct_a = acct_b 

Обновление соединения очень эффективно, но имеет несколько ограничений, что, если у вас нет этого индекса?

Вы можете написать стандартное обновление с другим подзапросом:

UPDATE poline a 
    SET a.account_code = (SELECT b.account_code 
          FROM material b 
          WHERE b.item_id = a.item_id 
          AND b.account_code is not null) 
WHERE a.account_code IS NULL 
    AND a.item_id IN (SELECT b.item_id 
         FROM material b 
         WHERE b.account_code IS NOT NULL) 

Самым элегантным решением ИМО, однако, вдохновленный answer to a similar question, будет:

MERGE INTO (SELECT * FROM a WHERE account_code IS NULL) a 
    USING (SELECT * FROM b WHERE account_code IS NOT NULL) b 
     ON (a.item_id = b.item_id) 
WHEN MATCHED THEN UPDATE SET a.account_code = b.account_code; 
+0

Спасибо.Я попытался удалить синтаксис DISTINCT, но я все равно получаю ту же ошибку недопустимого идентификатора. Я не могу создать уникальный индекс на столе. Так можно ли написать запрос? – cooldude

+0

@cooldude: это не единственное, что я изменил, посмотрите ближе :) –

+0

Вы имеете в виду и псевдоним? Я включил псевдоним и удалил ящик. – cooldude

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