当我尝试运行一个简单的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错误
答案 0 :(得分:3)
如果您不想使用别名,则可以在 USING 子句中直接指定table_name。您需要使用别名来引用 ON 子句中的column_names, SET 子句或 WHERE 子句。
文档中提供了该语法(虽然没有明确提到在USING子句中使用子查询的别名),但是由于您没有使用静态table_name,因此它与SQL标准一起使用子查询的别名
例如,
merge into table1
using table2
on (table1.col1 = table2.col1)
when matched
then update
set table1.col2 = 'hello';
现在,USING子句使您可以灵活地引用table2的任何列。
但是,为了便于阅读和理解,我总是使用别名限定子查询中的列。
为了使您的语句更易于阅读,请始终使用表,视图或实体化视图的名称或别名限定子查询中的列。
例如
merge into table1 t1
using table2 t2
on (t1.col1 = t2.col1)
when matched
then update
set t1.col2 = 'hello';