选择查询联接范围内的两个表

时间:2019-04-01 17:35:55

标签: sql postgresql

我有两个表:

带有列的表A

name | tag | price | ref

和带有列的表B:

id | time | min_ref | max_ref

我要进行以下查询,从表A中获取all列,从表B中获取idtime列,以这样的方式组合行:如果A中的值ref(min_ref, max_ref)范围内,则与B中的一行合并。示例:

A
name | tag | price | ref
A    | aaa | 78    | 456
B    | bbb | 19    | 123
C    | ccc | 5     | 789

B

id | time       | min_ref | max_ref
0  | 26-01-2019 | 100     | 150
1  | 27-01-2019 | 450     | 525
2  | 25-01-2019 | 785     | 800

查询应返回:

name | tag | price | ref | id | time 
A    | aaa | 78    | 456 | 1  | 27-01-2019
B    | bbb | 19    | 123 | 0  | 26-01-2019
C    | ccc | 5     | 789 | 2  | 25-01-2019

3 个答案:

答案 0 :(得分:3)

符号(min_ref, max_ref) for ranges signifies exclusive bounds。对于包含[min_ref, max_ref]

所以:

select a.*, b.id, b.time
from   a
join   b on a.ref > b.min_ref
        and a.ref < b.max_ref;

BETWEEN predicate将所有界限视为包含

答案 1 :(得分:1)

我认为这只是一个join

select a.*, b.id, b.time
from a join
     b
     on a.ref between b.min_ref and b.max_ref;

答案 2 :(得分:1)

您想要一个JOIN,它将两个表中的行与适当的条件组合在一起。例如:

SELECT a.name, a.tag, a.price, a.ref, b.id, bi.time
FROM a
INNER JOIN b ON b.min_ref <= a.ref AND b.max_ref >= a.ref

INNER JOIN从两个表ON中以指定条件查找匹配的行。在这种情况下,标准是a.refb.min_refb.max_ref之间。

您还可以使用sql BETWEEN operator简化条件:

SELECT ...
FROM a
INNER JOIN b ON a.ref BETWEEN b.min_ref AND b.max_ref