2015-09-11 115 views
0

我在寻找...缺少一个更好的词,一个“独家连接”。我只需要从右边的一行匹配左边的一行,并且不能连接到另一个前面的行。溶液应该是MS SQL 2012SQL连接两个表只匹配1行到1行

实施例:我有两个表A和B各自10行。行A1匹配B3和B5,行A3匹配B3和B5。结果集应该包括2行:A1加入B3(因为它是右边的第一个匹配),A3加入B5(因为它是右侧尚未使用的第一个匹配)。

显然,我试图避免游标。也许递归CTE是唯一的另一种方式去做这件事?要做到这一点

+2

,而不显示表结构和您尝试查询,以便far..it很难回答。 –

+3

为了帮助您,我们至少需要两张表格之间的表格架构和FK关系。 –

+0

查看左右连接是如何工作的。 – durbnpoisn

回答

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 
+0

当我正在阅读这个问题时,正在考虑这个确切的解决方案。有点奇怪,但肯定在可能的领域。 –

+0

这正是我所寻找的。谢谢。 –

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(nvarchar(2)) insert into table_a values('A1'),('A3');

create table table_b (b nvarchar(2)) 
insert into table_b values ('B3'),('B5');