如何基于数值区间关联两个SQL表并添加class字段
基于数值区间关联SQL表的解决方案
没问题,这是个很常见的基于数值区间的表关联需求,我来帮你搞定它~
首先先明确你的两个表结构(我暂时用t1指代第一个表、t2指代第二个表,你可以替换成实际的表名):
表t1的结构与数据
| id | position | name |
|---|---|---|
| 1 | 553 | John |
| 2 | 876 | James |
| 3 | 999 | Jack |
表t2的结构与数据
| id | class | interval_start | interval_end |
|---|---|---|---|
| 1 | class1 | 500 | 580 |
| 2 | class2 | 600 | 700 |
| 3 | class3 | 900 | 1200 |
核心关联SQL语句
要把t2里的class字段匹配到t1中,我们可以用JOIN语句,通过position落在t2的区间范围这个条件来关联:
SELECT t1.id, t1.position, t1.name, t2.class FROM t1 JOIN t2 ON t1.position > t2.interval_start AND t1.position < t2.interval_end;
查询结果说明
执行上面的语句后,你会得到这样的结果:
| id | position | name | class |
|---|---|---|---|
| 1 | 553 | John | class1 |
| 3 | 999 | Jack | class3 |
这里James的position是876,没有落在t2的任何区间里,所以不会出现在结果中。如果你希望即使没有匹配到区间,也保留t1的所有记录,可以改用LEFT JOIN,此时未匹配的class会显示为NULL:
SELECT t1.id, t1.position, t1.name, t2.class FROM t1 LEFT JOIN t2 ON t1.position > t2.interval_start AND t1.position < t2.interval_end;
对应的结果会包含所有t1的记录:
| id | position | name | class |
|---|---|---|---|
| 1 | 553 | John | class1 |
| 2 | 876 | James | NULL |
| 3 | 999 | Jack | class3 |
额外小提示
如果你的业务逻辑允许position等于区间的起始或结束值,可以把关联条件改成BETWEEN(这样会包含区间两端的数值):
ON t1.position BETWEEN t2.interval_start AND t2.interval_end
这样当position刚好等于interval_start或interval_end时,也能匹配到对应的class。
内容的提问来源于stack exchange,提问作者stanedav
相关产品推荐
相关产品推荐

