English 中文(简体)
在SQL中,我可以在嵌套查询中使用在嵌套查询外定义的变量吗?
原标题:
  • 时间:2008-11-14 19:51:20
  •  标签:

我正在尝试使下面的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

我在嵌套的选择语句内部无法使用外部范围的变量吗?你有什么想法?

附言:标识符在数据库表中确实有效。问题似乎是范围,但我想确保它确实是一个问题。

最佳回答

我不相信您可以在未加入的表中使用"ON"子句(即使用该列JOIN它)。附加的谓词需要在"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 doesn t have ID column (it could be field_id)
2) The SELECT doesn t seem to provide a join condition

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

连接 src 和 tableB 的条件在哪里?

从更新中获取的字段可以在嵌套查询中使用,如下面的测试所示:

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有同样的限制?





相关问题
热门标签