2014-04-09 52 views
2

我有一个小问题需要解决。我认为一开始应该很容易,但后来我无法解决它。sql - 加入两个对应值的表

我有2个表格。第一个表(例如)具有这样

表#1

NAME_1 | VALUE_1 
------------ 
A  | 2 
B  | 5 
C  | 7 
D  | 12 

而另外的部分数据具有这样

表#2

NAME_2 | VALUE_2 
------------ 
AA | 6 
AB | 12 

数据我试图得到如下的预期结果:

结果

NAME_1 | VALUE_1 | NAME_2 
-------------------------- 
A  | 2  | AA 
B  | 5  | AA 
C  | 7  | AB 
D  | 12  | AB 

正如你所看到的,结果表中有像

IF table1.value_1 <= table2.value_2 
    <show table2.name_2> -->> which suppose to be AA 
ELSE table1.value_1 > table2.value_2 AND table1.value_1 <= table2.value_2 
    <show table2.name_2> -->> which suppose to be AB 

一个某种形式的连接条件,一个人可以帮我解决这个问题呢?感谢您的关注。

回答

3

你可以尝试相关子查询,而不是一个复杂的连接条件:

select a.NAME_1, a.VALUE_1, 
    (
     select NAME_2 from TABLE_2 where VALUE_2 = 
     (
      select min(VALUE_2) from TABLE_2 where VALUE_2 >= a.VALUE_1 
     ) 
    ) as NAME_2 
from TABLE_1 as a 

首先,我们发现,最适合,然后找到与之相关的NAME_2的VALUE_2。

如果VALUE_2不唯一,您可能必须在NAME_2上使用min

+0

谢谢,我正在寻找可能的最佳最短查询来解决问题,并且您的建议像魅力一样起作用! – Dibyanugraha

0

听起来像表#2包含必须加入表#1的一系列值。下面的代码将在表#2中建立一个范围(假设0为最小可能值),然后将它加入到表#1中。

WITH [cte_ordered_Table2] AS 
    (
     SELECT 
      ROW_NUMBER() OVER (ORDER BY [VALUE_2]) [rn], 
      [NAME_2], 
      [VALUE_2] 
     FROM [Table2] 
    ), 
[cte_ranges] AS 
    (
     SELECT 
      A.[NAME_2], 
      ISNULL(B.[VALUE_2], 0) [min_value], 
      A.[VALUE_2] [max_value] 
     FROM [cte_ordered_Table2] A 
     LEFT JOIN [cte_ordered_Table2] B 
     ON  A.[rn] = B.[rn] + 1 
    ) 
SELECT 
    A.[NAME_1], 
    A.[VALUE_1], 
    B.[NAME_2] 
FROM [Table1] A 
LEFT JOIN [cte_ranges] B 
ON  A.[VALUE_1] BETWEEN B.[min_value] AND B.[max_value] 

[cte_ordered_Table2]订单使用ROW_NUMBER()函数在表#2中的记录,以便然后[cte_ranges]可以加入到本身建立的范围内,基于该顺序由1行偏移。