Могу ли я использовать в SQL переменную с областью действия вне вложенного выбора внутри самого вложенного выбора?

Я пытаюсь заставить работать следующий оператор 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. Идентификатор действительно действителен в таблице базы данных. Проблема, похоже, связана с объемом, но я хочу убедиться, что это действительно проблема.

Кстати, ваш вопрос не имеет отношения к PL / SQL.

Dave Costa 15.11.2008 00:06
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
1 472
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Глядя на 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. Если у них есть какие-либо пространственные отношения, они будут соединены.

Jordan Parmer 14.11.2008 23:36

Я думаю, что Шанкальпеш может быть прав - есть ли у update_tableA столбец с именем ID? Если этот столбец действительно существует - пожалуйста, ознакомьтесь с другой моей гипотезой в отдельном ответе.

Yarik 15.11.2008 12:23

Поля из обновления можно использовать во вложенном выборе, что можно увидеть в следующем тесте:

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 нет этого ограничения, как видно из моего ответа.

Leigh Riffel 17.11.2008 17:45

Я начинаю любить Oracle !! :-) А как насчет стандарта SQL? Допускает ли ИТ-служба псевдонимы в состояниях UPDATE?

Yarik 19.11.2008 21:18

Другие вопросы по теме