查找具有范围的 table 以填充属性

lookup a table with range to populate an attribute

我有一个要求,我有两个 table,如下所示:

table 名为 T1:

+-----------+
| days rate |
+-----------+
|         2 |
|        12 |
+-----------+

和 table 名为 T2:

+-------------+-------------+------+
| lower_range | upper_range | rate |
+-------------+-------------+------+
|           0 |           5 |    1 |
|          10 |          15 | 0.75 |
+-------------+-------------+------+

我想通过参考 T2 来更新 T1 上的“费率”,确定它属于哪个桶,因此预期输出将是:

+------+------+
| days | rate |
+------+------+
|    2 |    1 |
|   12 | 0.75 |
+------+------+

在 Oracle 中,考虑使用相关子查询:

update t1
set rate = (
    select t2.rate
    from t2
    where t1.days between t2.lower_range and t2.upper_range
)

您可能需要根据实际用例调整边界上的不等式。上面假设它们在两边都包含在内,但你也可以想要其他东西,比如在下端包含而在上端不包含:

    where t1.days >= t2.lower_range and t1.days < t2.upper_range

如果您不想更新 t2 中没有匹配项的行,则可以使用 exists:

进行过滤
update t1
set rate = (
    select t2.rate
    from t2
    where t1.days between t2.lower_range and t2.upper_range
)
where exists (
    select 1
    from t2
    where t1.days between t2.lower_range and t2.upper_range
)

您可以使用相关子查询:

update t1
    set rate = (select t2.rate from t2 where t1.days >= t2.lower_range and t1.days <= t2.upper_range);

如果您只想设置匹配的值,那么也可以使用 where

update t1
    set rate = (select t2.rate from t2 where t1.days >= t2.lower_range and t1.days <= t2.upper_range)
    where exists (select 1 from t2 where t1.days >= t2.lower_range and t1.days <= t2.upper_range);
merge into t1 trg
using
(
    select  lower_range, upper_range, rate
    from    t2
) src
on ( trg.days between src.lower_range and src.upper_range )
when matched then update
set trg.rate = src.rate
where lnnvl(trg.rate = src.rate);