如何连接表,以便右表值依赖于左表中的两个不同的行

时间:2011-08-11 01:24:27

标签: sql postgresql join

对不起凌乱的头衔,如果你是主持人并且知道更好的头衔,请随时改变。

说,我们有两个SQL表

intervals           vals       
--------            -------    
since               val        
--------            -------    
 1                  1          
 4                  2          
 8                  3
 20                 4          
 ...                ...
 500                100

我想进行连接,以便来自interval表的“since”字段是“val”的下限。并且“自”没有“val”的值不会出现。看看我想得到什么:

since val
--------------
1     1
1     2
1     3
4     4
4     5
4     6
4     7
8     8
8     9
.....

如何在通用SQL中执行此操作? Postgres-only解决方案也适用。

2 个答案:

答案 0 :(得分:3)

不要将其视为“多行”,而应将其视为范围

这样做你想要的:

select i.since, v.val
from intervals i
join vals v on v.val between i.since and 
    (select min(since) - 1 from intervals where since > i.since)
order by 1, 2;

测试代码(根据OP的问题在postgres上运行):

create table intervals (since int);
create table vals (val int);
insert into intervals values (1), (4), (8), (20), (500);
insert into vals values (1), (2), (3), (4), (5), (6), (7), (8), (9), (100);

以上查询的输出:

1   1
1   2
1   3
4   4
4   5
4   6
4   7
8   8
8   9
20  100

答案 1 :(得分:2)

归功于#postgresql上的RhodiumToad

SELECT  * 
FROM    vals v 
JOIN    (select since
              , lead(since) over (order by since) as "end" 
         from intervals) s 
         ON ( v.val >= s.since 
             AND ((v.val >= s."end") IS NOT TRUE)
            )
;