【问题标题】:How to select an unaliased numeric literal from a sub-select如何从子选择中选择无别名的数字文字
【发布时间】:2013-01-04 20:38:39
【问题描述】:

我想知道是否有一个通用的 SQL 语法允许从子选择中选择无别名的数字文字:

-- Seems to work in MySQL / Oracle
select table_alias."1"
from (
   select 1 from dual
) table_alias

我知道我可以为子选择中的字段设置别名:

-- Works everywhere
select table_alias.column_alias
from (
   select 1 column_alias from dual
) table_alias

但是如果我无法控制子选择怎么办?此外,一些 RDBMS 允许在为表设置别名时同时提供表和列别名:

-- Seems to work in Postgres / SQL Server
select table_alias.column_alias
from (
  select 1 from dual
) table_alias (column_alias)

但某些 RDBMS(例如 MySQL)无法做到这一点。还有其他方法吗?

  • 注意:这与任何特定的 RDBMS 无关,而只是一般的 SQL
  • 注意:我想省略星号,即没有select *...

这里有一个相关的问题:

Is there a generic workaround to express a derived column list in Oracle (and MySQL)?

【问题讨论】:

  • 以 select * from ()... 运行它?
  • @Randy,我忘了说我想省略星号
  • 这是 MySQL 还是 SQL Server(或其他)?在 SQL Server 中,使用派生表时必须为列指定别名。
  • @Jerad:像第三个例子一样?例如,这在 Postgres 中也是有效的......
  • 如果它是一个硬连线文字,为什么还要把它放在子查询中呢?

标签: sql alias subquery


【解决方案1】:

根据 ANSI-92 标准,它取决于实现。从第 7.9、9.c 节开始:

否则,第 i 列的 是依赖于实现的,不同于 引用的表的除自身以外的任何列 通过 SQL 语句中包含的任何

换句话说,这一切都将取决于您当时使用的 RDBMS。

顺便说一句,如果您正在寻找有趣的阅读,可以查看the ANSI-92 standards

【讨论】:

  • 找到了,谢谢指点。我知道这份文件,但是当涉及到这样的细节时,我显然不知道如何阅读它...... :-) 好吧,所以我没有运气。甚至没有办法通过i 索引访问列?我从来没有见过这种按索引访问的语法,所以我不相信有......

【解决方案2】:

在Oracle中,你可以这样做

select aa."2" from ( select 2 from dual ) aa

【讨论】:

  • 我的印象是这不起作用,例如 10g...?
  • 我确实试过了。不太确定你会用它来做什么,但它确实有效。
  • 你是对的,它确实在 Oracle 中工作。对不起,这个问题可能有点奇怪。这是用于数据库框架中的语法抽象。我需要知道这些用例的一般规则。或者每个 RDBMS 规则
猜你喜欢
  • 2018-11-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2014-04-03
  • 2014-11-12
  • 1970-01-01
相关资源
最近更新 更多