在select中实现FIRST()而不在WHERE中

时间:2013-12-16 20:22:39

标签: sql oracle11g oracle10g

当另一个相应字段具有最大值时,我希望在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<=1order by并期望得到正确的结果。

我该怎么做?

2 个答案:

答案 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