我正在寻找...缺少一个更好的词,一个“独家加入”。我只想从右边的一行匹配左边的一行,不能连接到另一个前一行。解决方案应该是MS SQL 2012。
示例:我有两个表A和B,每个表有10行。行A1匹配B3和B5,行A3匹配B3和B5。结果集应包括2行:A1连接到B3(因为它是右边的第一个匹配),A3连接到B5(因为它是右边第一个尚未使用的匹配)。
显然,我正在努力避免使用游标。也许递归CTE是另一种解决这个问题的方法吗?
答案 0 :(得分:2)
执行此操作的一种方法是对加入列应用row_number
调用,然后在加入时在其上添加条件:
SELECT a.*, b.*
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY join_col ORDER BY 1) rn
FROM table_a) a
JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY join_col ORDER BY 1) rn
FROM table_b) b ON a.join_col = b.join_col AND a.rn = b.rn
答案 1 :(得分:1)
请参阅下面的脚本。 CTE和光标不是我理解的淘汰赛要求......无论如何,我希望它会导致你的回答。
Without a identifier to join on
(我的问题中没有提供,我认为需要cross join
,partition by
就可以了。
这样的事情:
create table #t (a nvarchar(2),rna int, b nvarchar(2), rnb int)
insert into #t select * from
(select a
,row_number() over (partition by a order by a) rna
,b
,row_number() over (partition by b order by b) rnb
from table_a
cross join
table_b
) as x
where rnb=1
select a, b from #t
drop table #t
这里有一个创建表的脚本: create table table_a(anvarchar(2)) 插入table_a值('A1'),('A3');
create table table_b (b nvarchar(2))
insert into table_b values ('B3'),('B5');