所以我有一张基本上是树的桌子.每一行在同一个表中有一个父级,一个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%')
Run Code Online (Sandbox Code Playgroud)
这个问题是我想要做一些比以A开头的行更复杂的事情,所以条件会有更多的子句,而select和subselect也会有一些连接,我不知道我想重复一遍自己.特别是因为我将来可能需要修改它,我担心我可能会忘记其中一个选项中的某个子句.
因此,有一种更简单的方法,无需重复选择,以获得最大级别.
分析可能会帮助您:
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
Run Code Online (Sandbox Code Playgroud)
作为额外的好处,在大多数情况下,自联接的移除将是性能改进.