更容易的方法来选择具有特定列的最大值的行匹配条件

时间:2010-10-04 09:05:03

标签: sql oracle max

所以我有一张基本上是树的桌子。每一行在同一个表中有一个父级,一个lvl列告诉我树中的级别,root是lvl = 0.现在说我要选择所有名称以A开头的行,但只有那些这是该组中最高级别的。因此树可能有9个级别,但包含名称以A开头的行的最高级别可能在级别7上,因此我希望级别7上的所有行都以A开头(忽略较低级别的行)。我可以这样做:

select id, name, lvl
  from my_table
 where name like 'A%'
   and lvl = (select max(lvl) from my_table
               where name like 'A%')

这个问题是我想要做一些比用A开头的行更复杂的东西,所以条件会有更多的子句,而select和subselect也会有一些连接,并且我不想重复自己。特别是因为我将来可能需要修改它,我担心我可能会忘记其中一个选项中的一些条款。

这样有一种更简单的方法,无需重复选择,即可获得最高水平。

1 个答案:

答案 0 :(得分:5)

Analytics可能会对您有所帮助:

SELECT ID, NAME, rn
  FROM (SELECT id, NAME, rank() over(ORDER BY LVL DESC) rn 
          FROM my_table 
         WHERE NAME LIKE 'A%')
 WHERE rn = 1

作为额外的好处,在大多数情况下,删除自联接将是性能提升。