这是一个联接版本,在 CTE 中有示例数据:
with rankings (amnt1, amnt2, rank) as (
select 1, 5, 'rank1' from dual
union all select 5, 10, 'rank2' from dual
union all select 10, 15, 'rank3' from dual
),
amount (deptid, amount) as (
select 1, 0 from dual
union all select 2, 1 from dual
union all select 3, 4 from dual
union all select 4, 5 from dual
union all select 5, 6 from dual
union all select 6, 9 from dual
union all select 7, 10 from dual
union all select 8, 11 from dual
union all select 9, 15 from dual
union all select 10, 16 from dual
)
-- actual query
select a.deptid, a.amount, r.rank
from amount a
left join rankings r on a.amount >= r.amnt1 and a.amount < r.amnt2;
这与 Gordon 的子查询方法得到相同的结果:
DEPTID AMOUNT RANK
---------- ---------- -----
1 0
2 1 rank1
3 4 rank1
4 5 rank2
5 6 rank2
6 9 rank2
7 10 rank3
8 11 rank3
9 15
10 16
如您所见,使用这些比较条件意味着 ui 不匹配 15。您可以更改它们:
select a.deptid, a.amount, r.rank
from amount a
left join rankings r on a.amount > r.amnt1 and a.amount <= r.amnt2;
DEPTID AMOUNT RANK
---------- ---------- -----
1 0
2 1
3 4 rank1
4 5 rank1
5 6 rank2
6 9 rank2
7 10 rank2
8 11 rank3
9 15 rank3
10 16
但现在 1 不匹配。如果您尝试将两者都与 between 等效:
select a.deptid, a.amount, r.rank
from amount a
left join rankings r on a.amount >= r.amnt1 and a.amount <= r.amnt2;
DEPTID AMOUNT RANK
---------- ---------- -----
1 0
2 1 rank1
3 4 rank1
4 5 rank1
4 5 rank2
5 6 rank2
6 9 rank2
7 10 rank2
7 10 rank3
8 11 rank3
9 15 rank3
10 16
由于行重叠,您现在会获得多个结果。例如,当有不止一场比赛时,您可以通过保持“较高”排名来摆脱它们:
select a.deptid, a.amount,
max(r.rank) keep (dense_rank last order by r.amnt1) as rank
from amount a
left join rankings r on a.amount >= r.amnt1 and a.amount <= r.amnt2
group by a.deptid, a.amount;
DEPTID AMOUNT RANK
---------- ---------- -----
1 0
2 1 rank1
3 4 rank1
4 5 rank2
5 6 rank2
6 9 rank2
7 10 rank3
8 11 rank3
9 15 rank3
10 16
但是,实际上,您不应该有重叠;或者您需要定义哪个结果是正确的。 (如果您的数据总是匹配某些东西,您甚至可能根本不需要/想要一个下限;但这也是一个稍微不同的查询。)