当另一个相应字段具有最大值时,我希望在Oracle的字段中获得第一个值。
通常,我们会使用查询和子查询来执行此操作。子查询按字段排序,外部查询按where rownum<=1
排序。
但是,我不能这样做,因为表别名仅持续一层深度,这个查询是另一个大查询的一部分,我需要使用最外层查询中的一些别名。
这是查询结构
select
(
select a --This should get first value of a after b's are sorted desc
from
(
select a,b from table1 where table1.ID=t2.ID order by b desc
)
where rownum<=1
)
) as "A",
ID
from
table2 t2
现在这不会起作用,因为别名t2在最里面的查询中不可用。
我想到的真实世界类比是我有一张表格,其中包含公司所有员工的工资记录,工资(包括过去的工资)以及工资生效的日期。因此,对于每个员工,将有多个记录。现在,我希望得到所有员工的最新工资。
使用SQL服务器,我可以使用SELECT TOP
。但这不适用于Oracle,因为在订购之前执行了子句,我不能在同一查询中使用where rownum<=1
和order by
并期望得到正确的结果。
我该怎么做?
答案 0 :(得分:0)
使用您对员工及其薪水的类比,如果我理解您要做的事情,您可以做这样的事情(尚未经过测试):
SELECT *
FROM (
SELECT employee_id,
salary,
effective_date,
ROW_NUMBER() OVER (PARTITION BY employee_id ORDER BY effective_date DESC) rowno
FROM employees
)
WHERE rowno=1
答案 1 :(得分:0)
我更愿意看到你将子查询连接到JOIN而不是将其嵌入SELECT中。更清洁的SQL。然后你可以使用roartechs建议的窗口函数。
Select t2.whatever, t1.a
From table2 t2
Inner Join (
Select tfirst.ID, tfirst.a
From (
Select ID, a,
ROW_NUMBER() Over (Partition BY ID ORDER BY b DESC) rownumber
FROM table1
) tfirst
WHERE tfirst.rownumber=1
) t1 on t2.ID=t1.ID