我有一点问题需要解决。我认为一开始应该很容易,但后来我无法解决它。
我有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
有人可以帮我解决这个问题吗?感谢您的关注。
答案 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行。