Ansi SQL 子查询

Posted

技术标签:

【中文标题】Ansi SQL 子查询【英文标题】:Ansi SQL subquery 【发布时间】:2018-01-09 17:01:23 【问题描述】:

在特定的上下文中,我正在编写一个通用查询,它将在许多不同的 RDBMS(主要是 Oracle 和 Teradata)中执行,为了使这成为可能,我想按照 ANSI SQL 编写它,所以以下哪一项是一个有效的 ANSI SQL 查询:

select tab.* from (...) tab where 1=1
/* or */
select tab.* from (...) as tab where 1=1

【问题讨论】:

Second 在 Oracle 上不起作用。 两者都是有效的 ANSI SQL,as 关键字是可选的 @a_horse_with_no_name:那么为什么它不能在 lad2025 提到的 Oracle 上运行? @54l3d lad2025 是正确的。表别名的 as 关键字在 oracle (see similar answer on this very site) 中是非法的。除非有一个实现有 as 关键字 mandatory 用于表别名,否则第一个语法将是要走的路。否则,恐怕你会蒙混过关。 @54l3d:因为 Oracle 并不总是遵循 SQL 标准。仅仅因为一个语句根据标准是有效的,并不意味着它可以在所有 DBMS 上运行 【参考方案1】:

您必须为所需的搜索使用字段名称

select tab.* from (...) tab where (..field name..)=1

【讨论】:

where 1=1 是有效的,即使在这种情况下无用。显然他的问题与 ANSI SQL 中 AS 关键字的使用有关,而不是他的查询是否有用。

以上是关于Ansi SQL 子查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL中的子查询

SQL 子查询

使用递归子查询分解进行循环检测

SQl子查询

5. SQL子查询—内嵌的SQL子句

moon 子查询 SQL