sql - 连接两个具有相应值的表

时间:2014-04-09 15:39:12

标签: sql sql-server

我有一点问题需要解决。我认为一开始应该很容易,但后来我无法解决它。

我有2张桌子。第一个表(例如)有一些像这样的数据

表#1

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

另一个人有这样的数据

表#2

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

我尝试得到这样的预期结果

RESULT

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

有人可以帮我解决这个问题吗?感谢您的关注。

2 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分: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行。