Sql server 连接返回重复的行

Sql server 连接返回重复的行,sql-server,tsql,join,Sql Server,Tsql,Join,我在计算如何根据两个表协调记录时遇到了问题。表1将包含来自一个系统的记录,表2将包含来自另一个系统的记录。这两个表都将有一个唯一的ID列。表1可能包含类似的记录,但ID不同,表2的ID相同 表1 ID | Acct_Num | Amount | Dt ---------+-----------+---------+------------- 96 | 5836 | 75 | 2020-04-02 100 | 5836 | 75

我在计算如何根据两个表协调记录时遇到了问题。表1将包含来自一个系统的记录,表2将包含来自另一个系统的记录。这两个表都将有一个唯一的ID列。表1可能包含类似的记录,但ID不同,表2的ID相同

表1

ID       | Acct_Num  |  Amount | Dt
---------+-----------+---------+-------------
96       | 5836      | 75      | 2020-04-02
100      | 5836      | 75      | 2020-04-02
表2

ID       | Acct_Num  |  Amount | Dt
---------+-----------+---------+-------------
3        | 5836      | 75      | 2020-04-02
39       | 5836      | 75      | 2020-04-03
当我尝试连接Acct_Num和Amount时,结果返回4条记录,表1中的两条记录与表2中的两条记录都匹配

SELECT * FROM Table1 t1 INNER JOIN Table 2 ON t1.Acct_Num = t2.Acct_Num AND t1.Amount = t2.Amount

ID       | Acct_Num  |  Amount | Dt          |  ID       | Acct_Num  |  Amount | Dt
---------+-----------+---------+-------------+-----------+-----------+---------+-------------
96       | 5836      | 75      | 2020-04-02  |  3        | 5836      | 75      | 2020-04-02
96       | 5836      | 75      | 2020-04-02  |  39       | 5836      | 75      | 2020-04-03
100      | 5836      | 75      | 2020-04-02  |  3        | 5836      | 75      | 2020-04-02
100      | 5836      | 75      | 2020-04-02  |  39       | 5836      | 75      | 2020-04-03
我知道这就是连接的工作原理,但我希望实现的是在左边有一个记录,而在右边只有一个记录。我不管是哪一个。然后,左侧的下一条记录将与右侧的下一条可用记录匹配。最终结果如下:

ID       | Acct_Num  |  Amount | Dt          |  ID       | Acct_Num  |  Amount | Dt
---------+-----------+---------+-------------+-----------+-----------+---------+-------------
96       | 5836      | 75      | 2020-04-02  |  3        | 5836      | 75      | 2020-04-02
100      | 5836      | 75      | 2020-04-02  |  39       | 5836      | 75      | 2020-04-03

我有点迷失在如何才能做到这一点上。任何建议都会有帮助

如果您真的不关心记录是如何配对的,我们可以尝试使用
ROW\u NUMBER
ID
列排序进行完整的外部联接:

WITH cte1 AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Acct_Num ORDER BY ID) rn
    FROM Table1
),
cte2 AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Acct_Num ORDER BY ID) rn
    FROM Table2
)

SELECT t1.ID, t1.Acct_Num, t1.Amount, t1.Dt, t2.ID, t2.Acct_Num, t2.Amount, t2.Dt
FROM cte1 t1
FULL OUTER JOIN cte2 t2
    ON t1.Acct_Num = t2.Acct_Num AND
       t1.rn = t2.rn
ORDER BY
    t1.Acct_Num,
    t1.ID;


例如,如果第一个(或第二个)表有三条记录而不是两条记录,那么输出会是什么?请清楚完整地描述您希望返回的输入行。当固定下来,这将是一个常见问题。在考虑发帖之前,请先阅读您的课本和/或手册,并在谷歌上搜索任何错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,包括或不包括您的特定字符串/名称和网站:stackoverflow.com&tags;阅读许多答案。如果你发布一个问题,用一句话作为标题。反思你的研究。请参见文本上方的投票箭头。@TimBiegeleisen,好问题。如果第一个表有3条记录,则第三条记录(根据ID编号)与第二个表的任何内容都不匹配。如果第二个表有3条记录,它在任何方面都不会与第一个表匹配。