oracle sql语言引用合并/子查询文档错误?

xuo3flqw  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(403)

使用合并时:= MERGE INTO ... USING subquery t_alias 似乎必须用括号将子查询括起来,如 MERGE INTO ... USING (subquery) t_alias . 但是,oraclesql语言参考文档的subquery::=语法图似乎显示了可选路径(通过query\块)不需要括号。也就是说,文档似乎允许这两个版本。
例如:
以下内容无效,但根据文档允许。

MERGE INTO tblA A
USING SELECT col FROM tblB B -- ORA-00903 invalid table name and "SELECT" is highlighted.
ON (A.id = B.id)
...

以下是有效的(并且根据文档也是允许的)。

MERGE INTO tblA A
USING (SELECT col FROM tblB) B
ON (A.id = B.id)
...

根据如何阅读语法图
如果语法图有多个路径,那么您可以选择任何路径。
是否存在oracle sql语言参考文档错误?
提前谢谢。

n9vozmp4

n9vozmp41#

在合并查询中,using子句之后使用的操作数不完全是子查询。它实际上定义了一个表。例如:如果要从另一个表的值更新一个表。

MERGE INTO tblA A
USING tblB B
ON (A.id = B.id)
...

如果tblb有非常大量的数据,并且希望优化性能,可以使用查询从表中获取所需的列。

MERGE INTO tblA A
USING (SELECT col1, col2, col3 FROM tblB) B -- here we are not using complete table, 
instead we are using only required columns from the table
ON (A.id = B.id)
...

合并也类似于join,下面是更好的理解方式

select * from tblA A
inner join tblB B
ON (A.id = B.id);

select * from tblA A
inner join (SELECT col1, col2, col3 FROM tblB) B
ON (A.id = B.id);

获取无效表名的原因是,如果不将select语句括在括号中,oracle将不知道所用表的别名。因此,当查询中有特定条件时,请始终将括号括起来。

相关问题