执行INNER JOIN时重复的结果

cod*_*etc 4 sql-server inner-join cartesian-product sql-server-2008

我有两个简单的表,我想执行INNER JOIN,但问题是我得到重复(对于列str1和str2)结果:

CREATE TABLE #A (Id INT, str1 nvarchar(50), str2 nvarchar(50))
insert into #A  values (1, 'a', 'b')
insert into #A  values (2, 'a', 'b')

CREATE TABLE #B (Id INT, str1 nvarchar(50), str2 nvarchar(50))
insert into #B values (7, 'a', 'b')
insert into #B  values (8, 'a', 'b')

select * from #A a
INNER JOIN #B b ON a.str1 = b.str1 AND a.str2 = b.str2  
Run Code Online (Sandbox Code Playgroud)

当我真正想要2时,它给了我4条记录.

我得到了什么:
id | str1 | STR2 | id | str1 | str2
1 | a | b | 7 | a | b
2 | a | b | 7 | a | b
1 | a | b | 8 | a | b
2 | a | b | 8 | a | b

我真正想要的是:
1 a | b | 7 | a | b
2 a | b | 8 | a | b

有人可以帮忙吗?我知道这是可以使用游标和循环实现的,但是我想避免它,并且如果可能的话只使用某种类型的JOIN.

ype*_*eᵀᴹ 5

SELECT 
    a.id AS a_id, a.str1 AS a_str1, a.str2 AS a_str2, 
    b.id AS b_id, b.str1 AS b_str1, b.str2 AS b_str2
FROM 
    ( SELECT *
           , ROW_NUMBER() OVER (PARTITION BY str1, str2 ORDER BY id) AS rn
      FROM #A 
    ) a
  INNER JOIN 
    ( SELECT *
           , ROW_NUMBER() OVER (PARTITION BY str1, str2 ORDER BY id) AS rn
      FROM #B 
    ) b 
    ON  a.str1 = b.str1 
    AND a.str2 = b.str2 
    AND a.rn = b.rn ;
Run Code Online (Sandbox Code Playgroud)

如果你有一个更多的行或其他表的相同(str1, str2)组合,您可以选择哪些会改变退还INNER加盟任LEFT,RIGHTFULL加入.