【发布时间】:2021-05-06 13:14:54
【问题描述】:
给定一个初始表t1:
| i_t1 | tk |
|---|---|
| 400 | t1 |
| 702 | t2 |
还有第二张桌子t2:
| tk | i1_t2 | i2_t2 | v |
|---|---|---|---|
| t20 | 300 | 600 | 0.5 |
| t19 | 350 | 550 | 0.6 |
| t18 | 370 | 420 | 0.7 |
| t17 | 500 | 800 | 0.2 |
| t16 | 623 | 751 | 0.9 |
我希望得到以下结果:
| i_t1 | tk | tot |
|---|---|---|
| 400 | t1 | 1.8 |
| 702 | t2 | 1.1 |
这意味着我在表t1 中添加了一个列tot,其中包含t2 中v 列中所有值的总和,仅当i_t1(来自t1)在该范围内时[i1_t2 , i2_t2](来自t2)。
备选方案#1:
在t2中生成中间行,对应范围内的每个值ì。然后,按i 分组并交叉检查i 与i_t1 中的值。这已在my other post 中讨论过。但是,我注意到,在我的情况下,这将添加很多行(有时是不必要的,因为 t1 中没有匹配项)并产生性能问题。
备选方案#2:(概念)
逐行遍历t1,选择i_t1对应的值(例如400),然后取出下面查询得到的值:
select sum(v) from t2 where ((select i_t1 from t1 limit 1) >= i1_t2) and ((select i_t1 from t1 limit 1) <= i2_t2);
但是,这需要在 t1 的所有行上重复,我不确定如何将结果返回到 t1。
有没有更有效的方法来实现这一点?
以下是可用于重现的查询:
create table t1 (i_t1 int, tk varchar(5));
insert into t1 (i_t1, tk)
values (400,'t1'),(702,'t2');
create table t2 (tk varchar(5), i1_t2 int, i2_t2 int, v real);
insert into t2 (tk, i1_t2, i2_t2, v)
values ('t20',300,600,0.5),('t19',350,550,0.6),('t18',370,420,0.7),('t17',500,800,0.2),('t16',623,751,0.9);
【问题讨论】:
标签: sql postgresql