为啥 Oracle SQL 不允许我们在条件中使用别名?

Posted

技术标签:

【中文标题】为啥 Oracle SQL 不允许我们在条件中使用别名?【英文标题】:Why won't Oracle SQL let us use aliases in conditions?为什么 Oracle SQL 不允许我们在条件中使用别名? 【发布时间】:2010-02-10 10:01:46 【问题描述】:

Oracle PL/SQL 不允许用户在条件中使用别名。在大多数情况下,使用别名而不是长语句对我来说非常实用。这是什么原因?如果我们可以在条件中使用别名会发生什么坏事?

示例:What's wrong with this SQL query?

【问题讨论】:

也在这里问:***.com/questions/268429/group-by-alias-oracle 虽然下面的答案很好 【参考方案1】:

我认为这只是因为这是 SQL 标准所指定的。我不同意 gd047 使用别名 couldn't:HAVING 子句对查询的(中间)结果进行操作,即在聚合之后,因此对于查询解析器使用别名来访问该结果。

您当然可以避免像这样重复 SUM(使用链接问题中的示例):

SELECT *
from
( SELECT donem, bolge_adi, sehir_tasra "1=S, 2=T", 
         COUNT(DISTINCT mekankodu) "M.SAYISI",
         SUM(b2b_dagitim + b2b_transfer - b2b_iade) satis
  FROM mps_view2
  WHERE donem IN ('200612','200712','200812','200912')
  AND (ob IS NOT NULL OR b2b_ob IS NOT NULL)
  GROUP BY donem, bolge_adi, sehir_tasra
)
WHERE satis > 0
ORDER BY donem, bolge_adi, sehir_tasra

【讨论】:

【参考方案2】:

列别名只适用于 order by 子句,因为 order by 在 select 之后执行,所有其他在 select 之前执行,所以他们对别名没有任何概念。

你可以看到这个page。我相信甲骨文的引擎也是如此。

【讨论】:

以上是关于为啥 Oracle SQL 不允许我们在条件中使用别名?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 oracle SQL 中,在条件相差很大的情况下,对同一列执行具有两个不同值的查询所花费的时间

在导入Oracle数据库的时候违反唯一约束条件是为啥?要怎么解决?

为啥在oracle数据库中多条查询语句无法同时进行

为啥存储函数中不允许使用动态 SQL?

为啥 C 在使用条件运算符时不允许连接字符串?

为啥oracle数据库链接不显示来自sql server的图像类型的列