CREATE TABLE #A (UpperLimit NUMERIC(4))
CREATE TABLE #B (Id NUMERIC(4), Amount NUMERIC(4))
INSERT INTO #A VALUES
(1000), (2000), (3000)
INSERT INTO #B VALUES
(1, 3100),
(2, 1900),
(3, 1800),
(4, 1700),
(5, 900),
(6, 800)
给定这两个表,我想在B.Amount < A.UpperLimit
上将表A连接到B,但表B中的每条记录只能使用一次,因此所需的输出为:
我可以很容易地做到这一点,通过plopping表B的记录到一个临时表,游标在表A采取顶端记录〈上限和删除该记录从临时表或其他一些编程解决方案,但我想避免,我很肯定这可以用一个“正常”(递归CTE?分区?)查询。
4条答案
按热度按时间cedebl8k1#
您可以使用以下递归CTE实现所需的输出
演示:https://dbfiddle.uk/Y-m0K6Mk
e0bqpujr2#
可能有点长,但希望足够清楚。
jgzswidk3#
为此,可以将
APPLY
与TOP 1
一起使用,外层表中的每一行只能从APPLY
中获取一行。要模拟内连接(而不是左连接),请使用
CROSS APPLY
。s71maibg4#
此查询返回的结果非常接近所需结果。
此查询使用3个公用表表达式。第一个使用ROW_NUMBER()函数和PARTITION BY子句对表B进行排序,第二个使用给定的条件将表A与表B进行JOIN,第三个筛选表A上处于Limit中的记录,并仅使用一次Limit。