Вот одна версия объединения с примерами данных в 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;
, которая дает тот же результат, что и подход подзапроса Гордона:
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
Как вы можете видеть, используя эти условия сравненияозначает, что нет совпадений для 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
Но, на самом деле, у вас не должно быть совпадений;или вам нужно определить, какой из результатов является правильным.(Вам может даже не понадобиться / не хотеть нижней границы вообще, если ваши данные всегда будут соответствовать чему-либо; но это также немного другой запрос.)