create table tq84_range (
range_id number not null,
range_seq number not null,
min_ number not null,
max_ number,
factor number not null,
--
primary key (range_id, range_seq)
);
insert into tq84_range values (1, 1, 0, 10, 1.0);
insert into tq84_range values (1, 2, 10, 100, 1.5);
insert into tq84_range values (1, 3,101,null, 2.5);
insert into tq84_range values (2, 1, 0, 18, 1.0);
insert into tq84_range values (2, 2, 19,null, 2.0);
create table tq84_application (
app_id number not null,
raw_value number not null,
range_id number not null,
primary key (app_id)
);
insert into tq84_application values (1, 20.0, 1);
insert into tq84_application values (2, 25.0, 2);
insert into tq84_application values (3, 18.5, 2);
Вы хотите использовать left join
.
При таком левом соединении вы гарантируете, что каждая запись левого
таблица (таблица, появляющаяся до left join
в
выберите текст выписки) будет возвращен как минимум один раз,
хотя условие where не находит запись
в правой таблице.
Если tq84_range.range is null
, то вы знаете, что соединение
условие не нашел запись в tq84_range, следовательно, там
похоже на пробел. Итак, вы печатаете Missing:
.
Так как tq84_application.max_
может быть null
и NULL отображается в
укажите бесконечность или верхняя граница вы проверяете верхний предел
с nvl(tq84_range.max_, tq84_application.raw_value
Таким образом, оператор select станет примерно таким:
select
case when tq84_range.range_id is null then 'Missing: '
else ' '
end,
tq84_application.raw_value
from
tq84_application left join
tq84_range
on
tq84_application.range_id = tq84_range.range_id
and
tq84_application.raw_value between
tq84_range.min_ and nvl(tq84_range.max_, tq84_application.raw_value);