Я пытаюсь заставить работать следующий оператор SQL:
UPDATE myschema.tableA update_tableA
SET field_id =
( SELECT src.field_id
FROM myschema.srcTable src
INNER JOIN myschema.tableB tableB ON
update_tableA.id = tableB.id
AND SDO_ANYINTERACT( tableB.shape, src.shape ) = 'TRUE' );
Когда я запускаю этот оператор, я получаю следующую ошибку:
ORA-00904: "UPDATE_TABLEA"."ID": invalid identifier
Могу ли я не использовать переменную с областью действия вне вложенного выбора во вложенном выборе? Какие-нибудь мысли?
P.S. Идентификатор действительно действителен в таблице базы данных. Проблема, похоже, связана с объемом, но я хочу убедиться, что это действительно проблема.


Глядя на SQL выше, я думаю вот о чем
1) myschema.tableA не имеет столбца идентификатора (это может быть field_id)
2) SELECT, похоже, не обеспечивает условия соединения
SELECT src.field_id
FROM myschema.srcTable src
INNER JOIN myschema.tableB tableB ON
Где условие для СОЕДИНЕНИЯ src с tableB?
В этом конкретном запросе используется Oracle Spatial, поэтому 'src' и 'tableB' являются частью оператора INNER JOIN в вызове SDO_ANYINTERACT. Если у них есть какие-либо пространственные отношения, они будут соединены.
Я думаю, что Шанкальпеш может быть прав - есть ли у update_tableA столбец с именем ID? Если этот столбец действительно существует - пожалуйста, ознакомьтесь с другой моей гипотезой в отдельном ответе.
Поля из обновления можно использовать во вложенном выборе, что можно увидеть в следующем тесте:
drop table test;
create table test as (select 1 key, 'a' value from dual);
insert into test values (2,'b');
select * from test;
update test t1
set value = (select 'c' from dual where t1.key=2);
select * from test;
Я не уверен, почему в данном случае это не работает. Похоже, может потребоваться явное соединение с TableA.
Я не верю, что вы можете ПРИСОЕДИНЯТЬСЯ к столбцу (т.е. использовать его в предложении ON), который не находится в одной из объединяемых таблиц. Дополнительные предикаты должны быть в предложении WHERE.
Попробуй это:
UPDATE myschema.tableA update_tableA
SET field_id =
( SELECT src.field_id
FROM myschema.srcTable src
INNER JOIN myschema.tableB tableB ON
SDO_ANYINTERACT( tableB.shape, src.shape ) = 'TRUE'
WHERE update_tableA.id = tableB.id
);
Должен признать, что я не знаком с Oracle, но я более или менее побежден диалектом SQL SQL Server. И в последний раз, когда я смотрел, этот диалект SQL не позволяет указать псевдоним для обновляемой таблицы в операторе UPDATE. Т.е. в SQL Server идентификатор update_tableA.id был бы недопустимым. Возможно ли, что у Oracle такое же ограничение?
У t нет этого ограничения, как видно из моего ответа.
Я начинаю любить Oracle !! :-) А как насчет стандарта SQL? Допускает ли ИТ-служба псевдонимы в состояниях UPDATE?
Кстати, ваш вопрос не имеет отношения к PL / SQL.