不能在同一个查询中使用 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 *的主要内容,如果未能解决你的问题,请参考以下文章