В SQL можно ли использовать переменную, выходящую за пределы вложенного выбора внутри самого вложенного выбора? - PullRequest
1 голос
/ 14 ноября 2008

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

Ответы [ 4 ]

3 голосов
/ 15 ноября 2008

Я не верю, что вы можете ПРИСОЕДИНИТЬСЯ к столбцу (то есть использовать его в предложении 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 
   );
0 голосов
/ 15 ноября 2008

Я должен признать, что я не знаком с Oracle, но я более или менее избит SQL-диалектом SQL Server. И в последний раз, когда я смотрел, этот диалект SQL не позволяет указывать псевдоним для обновляемой таблицы в инструкции UPDATE. То есть в SQL Server идентификатор update_tableA.id будет недопустимым. Возможно ли, что Oracle имеет такое же ограничение?

0 голосов
/ 15 ноября 2008

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

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;

Я не уверен, почему это не работает в этом случае. Похоже, может потребоваться явное соединение с таблицей A.

0 голосов
/ 14 ноября 2008

Глядя на SQL выше, вот что я думаю

1) myschema.tableA не имеет столбца идентификатора (это может быть field_id)
2) Кажется, что SELECT не обеспечивает условия соединения

SELECT src.field_id FROM myschema.srcTable src INNER JOIN myschema.tableB tableB ON

Где находится условие ПРИСОЕДИНИТЬСЯ к src с таблицей B?

...