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 中的数据进行排序