Oracle SQL 语言参考合并/子查询文档错误?

Posted

技术标签:

【中文标题】Oracle SQL 语言参考合并/子查询文档错误?【英文标题】:Oracle SQL Language Reference Merge/Subquery Documentation Error? 【发布时间】:2020-05-24 02:17:11 【问题描述】:

当使用merge::=MERGE INTO ... USING subquery t_alias 时,似乎必须将子查询 括在括号中,如MERGE INTO ... USING (subquery) t_alias。但是,subquery::= 的 Oracle SQL 语言参考文档的语法图似乎表明可选路径(通过 query_block)不需要括号。那就是文档似乎允许这两个版本。

例如:

以下内容无效,但根据文档是允许的。

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)
...

根据How to Read Syntax Diagrams

如果语法图有多个路径,则可以选择任意路径。

是否存在 Oracle SQL 语言参考文档错误?

提前致谢。

【问题讨论】:

如果您向右滚动到(合并)文档的底部,则会出现向上/向下按钮;单击大拇指向下将为您提供反馈表,您可以在其中解释您的担忧/困惑。 (您曾经能够报告文档错误;不知道这些错误是否相同。) 【参考方案1】:

在 MERGE 查询中,在 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)
...

Merge也和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 将不知道您正在使用的表的别名。因此,当您在查询中有特定条件时,请始终用括号括起来。

【讨论】:

问题不在于语义,而在于语法。已经同意,Oracle 将无法从 (SELECT ...FROM tblB) B 的 t_alias 中辨别出 tblB 的 t_alias。这就是重点,文档中的语法图在将 t_alias 与子查询一起使用时应该需要括号.至于USING之后的操作数不完全是子查询,那么Oracle在图中不应该称其为“子查询”。

以上是关于Oracle SQL 语言参考合并/子查询文档错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用子查询和 wm_concat 对 Oracle SQL 中的数据进行排序

oracle sql语言模糊查询

ORACLE LEFT JOIN 子查询 在SQL SERVER中可以使用如图中的子查询,ORACLE中怎么实现

Oracle SQL - 多级相关子查询不起作用

sql子查询和连接查询的区别是啥呢?

Oracle SQL语言之查询语句_超越OCP精通Oracle视频教程培训29