在SQL中,我可以在嵌套选择本身中使用嵌套选择之外的变量吗?

StackOverflow https://stackoverflow.com/questions/291172

  •  08-07-2019
  •  | 
  •  

我正在尝试使用以下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。标识符在数据库表中确实有效。问题似乎是范围,但我想确保这确实是一个问题。

有帮助吗?

解决方案

我不相信你可以加入一个列(即在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 
   );

其他提示

看看上面的SQL,这就是我的想法

1)myschema.tableA没有ID列(可能是field_id)
2)SELECT似乎没有提供连接条件

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

使用tableB加入src的条件在哪里?

更新中的字段可以在嵌套选择中使用,如以下测试所示:

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明确联接。

我必须承认我不熟悉Oracle,但我或多或少被SQL Server的SQL方言所打败。我最后一次看,这个SQL方言不允许在UPDATE语句中为要更新的表指定别名。即在SQL Server中,标识符 update_tableA.id 将是非法的。 Oracle可能有相同的限制吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top