不能在同一个查询中使用 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..) 以及声明局部变量