SQL连接两个表只匹配1行到1行

时间:2015-09-11 18:27:56

标签: sql sql-server select join

我正在寻找...缺少一个更好的词,一个“独家加入”。我只想从右边的一行匹配左边的一行,不能连接到另一个前一行。解决方案应该是MS SQL 2012。

示例:我有两个表A和B,每个表有10行。行A1匹配B3和B5,行A3匹配B3和B5。结果集应包括2行:A1连接到B3(因为它是右边的第一个匹配),A3连接到B5(因为它是右边第一个尚未使用的匹配)。

显然,我正在努力避免使用游标。也许递归CTE是另一种解决这个问题的方法吗?

2 个答案:

答案 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 joinpartition 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');