SQL 按范围加入

SQL join by range

我有两个 table,table 个范围或限制

id min max
A   -3  -2
B   -2  -1
C   -1  10

和 table 数据

name value
c1     1.5
c2    -1.2
c3    -2.3
c4     0.3

我想要的结果如下:

name value id
c1     1.5  C
c2    -1.2  B
c3    -2.3  A
c4     0.3  C

怎么做呢?

更新

我试过的代码如下:

select m.*
n.*
from m
join n 
on m.value between n.min and n.max

我的 table(显然)比那些大,所以这个 query 需要很长时间,所以我想有更好的方法。

假设您的限制包括在内:

select 
   data.name, data.value, limits.id
from 
   data, limits 
where
   data.value >= limits.min and
   data.value <= limits.max

试试这个:

select
   dat.name
   ,dat.value
   ,lmt.id
from test_data dat
cross join test_limits lmt
where dat.value > lmt.min 
   and dat.value < lmt.max
order by
dat.name

这三种方法都使用交叉连接/笛卡尔积,然后过滤结果以强制执行limits/rules。

如果数据 table 非常大,那么使用这三种方法中的任何一种都将得到一个巨大的交叉 product/cartesian 产品。

这是一个不同的想法。我们通过案例陈述来强制执行限制。我认为这个 运行 应该和 "select * from data":

一样快
select 
   name, value, 
   case 
     when value > -3  and value <= -2  then 'A' 
     when value > -2  and value <= -1  then 'B' 
     when value > -1  and value <=  10 then 'C'
   end as id 
from data
where value > -3 and value <=10

我进行了编辑以过滤掉超出限制的值。我的猜测是,这在 hive/MR 上下文中应该 运行 很快,因为 filter + case 方法非常适合 hive 的分布式特性。您能否就交叉连接与案例之间的性能差异给我一些反馈?