不能在同一个查询中使用 Partition by 和 select *

Posted

技术标签:

【中文标题】不能在同一个查询中使用 Partition by 和 select *【英文标题】:Can't use Partition by and select * in the same query 【发布时间】:2017-04-05 19:53:11 【问题描述】:

我对下面的代码有以下错误:“FROM 关键字在预期的地方找不到

SELECT *, MAX(Salary)
OVER (PARTITION BY ID_DEPT ORDER BY Salary DESC ) R
FROM SG_EMPLOYEES;

但是当我用每列的名称更改星号时,一切正常。所以我只是想了解这背后的原因。

【问题讨论】:

不是答案,但 ORDER BY 的存在在这种情况下没有多大意义。 试试SG_EMPLOYEES.* 而不是* 是的。知道了。谢谢! 【参考方案1】:

当您在 Oracle 中使用 * 时,如果选择了任何其他表达式,则必须对其进行限定。所以:

SELECT e.*,
       MAX(e.Salary) OVER (PARTITION BY e.ID_DEPT ORDER BY e.Salary DESC) as R
FROM SG_EMPLOYEES e;

请注意,我非常喜欢限定所有列名。

您的查询实际上看起来很奇怪。你不需要ORDER BY 子句:

SELECT e.*,
       MAX(e.Salary) OVER (PARTITION BY e.ID_DEPT) as R
FROM SG_EMPLOYEES e;

您的版本采用累积最大值,然后将薪水从最高到最低排序 - 因此累积值与总体最高值相同。

【讨论】:

谢谢!我不知道调用 select asterisk 时会考虑分析函数的别名,从而导致错误。

以上是关于不能在同一个查询中使用 Partition by 和 select *的主要内容,如果未能解决你的问题,请参考以下文章

oracle查询中over(partition by ...order by ...)用法

如何在 over 函数中使用 partition by 和 order by?

Oracle 能否使用 PARTITION BY 分析函数对查询使用谓词推送?

使用 Row_number() OVER(partition BY..) 以及声明局部变量

使用 OVER (PARTITION BY ) 而不是 Group By

Oracle LISTAGG() 聚合查询用法 GROUP BY 和 PARTITION BY 的使用和比较