查找具有范围的 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);
我有一个要求,我有两个 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);