2016-03-20 3 views
1

У меня есть 2 таблицы: Я хочу обновить записи в таблице1 с подходящим возрастом, который можно найти в таблице2. Уникальный идентификатор - BVD_ID_NUMBER. Я пытался сделать это с помощью следующего кодаИспользование внутреннего соединения при обновлении в Oracle

UPDATE table1 
    SET table1.age = 
    (select table2.age2 
    from 
     (select distinct table2.BVD_ID_NUMBER, table2.age2 
     FROM table1 
     inner JOIN table2 
     on table1.ACQUIROR_BVD_ID_NUMBER=table2.BVD_ID_NUMBER) 
    where table2.BVD_ID_NUMBER=table1.ACQUIROR_BVD_ID_NUMBER); 

я получил следующее сообщение об ошибке: SQL Error: ORA-00904: "ORBIS_DISTINCT" "BVD_ID_NUMBER": недопустимый идентификатор 00904. 00000 - «% s:. Недействительны идентификатор "

Любая помощь?

ответ

1

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

UPDATE table1 t1 
    SET age = (select t2.age2 
       from table2 t2 
       where t1.ACQUIROR_BVD_ID_NUMBER = t2.BVD_ID_NUMBER 
      ); 

Это может привести к «подзапрос возвращает более одной строки» тип ошибки. Чтобы исправить это, использование агрегации или rownum = 1:

UPDATE table1 t1 
    SET age = (select t2.age2 
       from table2 t2 
       where t1.ACQUIROR_BVD_ID_NUMBER = t2.BVD_ID_NUMBER and 
        rownum = 1 
      ); 
+0

Я не думаю, что он пытался рамки более 1 уровень вниз, он просто не псевдоним ничего .. – sagi

+0

@sagi. , , Я исправил ответ. Ты прав. Сообщение об ошибке Oracle явно не соответствовало запросу в вопросе, поэтому я скорее проигнорировал его. –

+0

Работает как шарм, фиксируя alliasses dit the job! – Louwinho

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