A'合并到'不使用别名的语句?

时间:2015-05-11 12:30:10

标签: sql oracle

当我尝试运行一个简单的merge查询时,如果我没有为using语句中的表设置别名,我发现它失败了:例如< / p>

create table table1test (col1 int not null,
                         col2 varchar2(255),
                         primary key(col1));

INSERT ALL
  INTO table1test (col1, col2) VALUES (1, '10')
  INTO table1test (col1, col2) VALUES (2, '20')
  INTO table1test (col1, col2) VALUES (3, '30')
SELECT * FROM dual;

create table table2test (col1 int not null,
                         col2 varchar2(255),
                         primary key(col1));

INSERT ALL
  INTO table2test (col1, col2) VALUES (1, 'a')
  INTO table2test (col1, col2) VALUES (2, 'b')
  INTO table2test (col1, col2) VALUES (3, 'c')
SELECT * FROM dual;

使用上面的表格,这很好用:

merge into table1 
  using (select col1 from table2) test2 on (table1.col1 = test2.col1)
when matched
then update
set table1.col2 = 'hello';

但是这个(即只删除table2的别名)

merge into table1 
  using (select col1 from table2) on (table1.col1 = table2.col1)
when matched
then update
set table1.col2 = 'hello';

返回此错误:

Error report:
SQL Error: ORA-00904: "TABLE2TEST"."COL1": invalid identifier
00904. 00000 -  "%s: invalid identifier"

这是因为它真的是对using子句而不是表的检查吗?或者还有其他我错过的东西? Oracle help page for USING并未声明using子句必须包含别名。

[n.b。我无法创建这样的SQLFiddle;当我在那里运行时,本地工作的简单合并语句返回ora-00900错误

1 个答案:

答案 0 :(得分:3)

如果您不想使用别名,则可以在 USING 子句中直接指定table_name。您需要使用别名来引用 ON 子句中的column_names, SET 子句或 WHERE 子句。

文档中提供了该语法(虽然没有明确提到在USING子句中使用子查询的别名),但是由于您没有使用静态table_name,因此它与SQL标准一起使用子查询的别名

enter image description here

例如,

merge into table1 
  using table2 
on (table1.col1 = table2.col1)
when matched
then update
set table1.col2 = 'hello';

现在,USING子句使您可以灵活地引用table2的任何列。

但是,为了便于阅读和理解,我总是使用别名限定子查询中的列。

来自documentation

  

为了使您的语句更易于阅读,请始终使用表,视图或实体化视图的名称或别名限定子查询中的列。

例如

merge into table1 t1
  using table2 t2
on (t1.col1 = t2.col1)
when matched
then update
set t1.col2 = 'hello';