我在寻找...缺少一个更好的词,一个“独家连接”。我只需要从右边的一行匹配左边的一行,并且不能连接到另一个前面的行。溶液应该是MS SQL 2012SQL连接两个表只匹配1行到1行
实施例:我有两个表A和B各自10行。行A1匹配B3和B5,行A3匹配B3和B5。结果集应该包括2行:A1加入B3(因为它是右边的第一个匹配),A3加入B5(因为它是右侧尚未使用的第一个匹配)。
显然,我试图避免游标。也许递归CTE是唯一的另一种方式去做这件事?要做到这一点
我在寻找...缺少一个更好的词,一个“独家连接”。我只需要从右边的一行匹配左边的一行,并且不能连接到另一个前面的行。溶液应该是MS SQL 2012SQL连接两个表只匹配1行到1行
实施例:我有两个表A和B各自10行。行A1匹配B3和B5,行A3匹配B3和B5。结果集应该包括2行:A1加入B3(因为它是右边的第一个匹配),A3加入B5(因为它是右侧尚未使用的第一个匹配)。
显然,我试图避免游标。也许递归CTE是唯一的另一种方式去做这件事?要做到这一点
一种方法是应用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
当我正在阅读这个问题时,正在考虑这个确切的解决方案。有点奇怪,但肯定在可能的领域。 –
这正是我所寻找的。谢谢。 –
见下面的脚本。 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(nvarchar(2)) insert into table_a values('A1'),('A3');
create table table_b (b nvarchar(2))
insert into table_b values ('B3'),('B5');
,而不显示表结构和您尝试查询,以便far..it很难回答。 –
为了帮助您,我们至少需要两张表格之间的表格架构和FK关系。 –
查看左右连接是如何工作的。 – durbnpoisn