Обновление SQL с подзапросом - PullRequest
1 голос
/ 21 сентября 2011

У меня проблема со следующим запросом на обновление в Oracle 11g:

update TABLE_A a set COL1 = 
  (SELECT b.COL2 FROM
    (SELECT ROWNUM AS ROW_NUMBER, b.COL2 from TABLE_B b where COL3 = a.COL4) 
   WHERE ROW_NUMBER = 2
  )

ORA-00904: "A". "COL4": неверный идентификатор.

Итак,a.COL4 не известен в подзапросе, но я не знаю, как решить эту проблему.

/ Правка.Что я пытаюсь сделать?

В TABLE_B есть несколько записей для каждой записи в TABLE_A.Новые требования от клиента, однако: TABLE_A получит 2 новых столбца, а TABLE_B будет удален.Таким образом, представление первой записи подзапроса будет записано в первое новое поле и то же самое для второго.Первая запись проста, поскольку решение Майка Си можно использовать с ROW_NUMBER = 1.

Пример строк:

TABLE_A

| col0 | col1 | col2 | col3 | col4 |
------------------------------------
|      |      |dummy2|dummy3|   1  |
------------------------------------
|      |      |dummy4|dummy5|   2  |
------------------------------------

TABLE_B

| col1 | col2 | col3 |
----------------------
|  d   |name1 |   1  |
----------------------
|  d   |name2 |   1  |
----------------------
|  d   |name3 |   1  |
----------------------
|  d   |name4 |   2  |
----------------------


TABLE_A after update

| col0 | col1 | col2 | col3 | col4 |
------------------------------------
| name1| name2|dummy2|dummy3|   1  |
------------------------------------
| name4|      |dummy4|dummy5|   2  |
------------------------------------

Ответы [ 5 ]

0 голосов
/ 16 мая 2013

Я решил эту проблему с помощью временной таблицы, удалив из нее данные по мере заполнения таблицы A.

0 голосов
/ 21 сентября 2011

Я думаю, что это может быть возможным решением вашей проблемы, но в зависимости от объема обрабатываемых данных это может быть очень медленным, потому что нет никакого ограничивающего фактора для внутреннего оператора.

0 голосов
/ 21 сентября 2011
UPDATE TABLE_A a SET COL1 = 
  (SELECT b.COL2 FROM
    (SELECT ROWNUM AS ROW_NUMBER, b.COL2 FROM TABLE_B b, TABLE_A innerA WHERE COL3 = innerA.COL4) 
   WHERE ROW_NUMBER = 2
  )
0 голосов
/ 21 сентября 2011

Можете ли вы исключить один из таких подзапросов, как этот?

update TABLE_A a set COL1 = 
(SELECT b.COL2 FROM TABLE_B b where COL3 = a.COL4 AND ROWNUM = 2)
0 голосов
/ 21 сентября 2011

Попробуйте

update TABLE_A a set COL1 = 
  (SELECT b.COL2 FROM
    (SELECT ROWNUM AS ROW_NUMBER, b.COL2 from TABLE_B b, TABLE_A a2 where b.COL3 = a2.COL4) 
   WHERE ROW_NUMBER = 2
  )

Я предполагаю, что COL3 происходит из таблицы b, а также почему вы включаете выбор ROWNUM в подзапрос?Это может быть только 2 из вашего предложения WHERE.

...