独特的左边连接多对多桌子

时间:2013-11-18 16:37:09

标签: sql-server

我正在使用sqlserver,我有两个包含以下数据的表。我需要选择那些匹配的行而不重复。

表-A:

A_ID | Item_ID
--------------------
1    | 101
2    | 101
3    | 103
4    | 103
5    | 199

表-B:

B_ID | Item_ID
--------------------
11    | 101
12    | 101
13    | 102
14    | 103
15    | 103
16    | 103

预期结果:

A_ID | Item_ID | B_ID
----------------------
1    | 101     | 11
2    | 101     | 12
3    | 103     | 14
4    | 103     | 15

我试过了:

SELECT A_ID, a.Item_ID, B_ID FROM Table_A a LEFT JOIN
Table_B b ON a.Item_ID = b.Item_ID

但它显示了所有可能的记录。

如何在上面显示预期结果?

1 个答案:

答案 0 :(得分:1)

根据结果集,您为每个A提供了一个B的唯一记录,忽略了A中没有相应记录的记录。以下内容将起作用:

SELECT
    AValues.A_ID,
    AValues.Item_ID,
    BValues.B_ID
FROM
(SELECT
    A_ID,
    Item_ID,
    ROW_NUMBER() OVER(PARTITION BY Item_ID ORDER BY A_ID) ARowID
FROM    
    Table_A) AValues
INNER JOIN (SELECT
    B_ID,
    Item_ID,
    ROW_NUMBER() OVER(PARTITION BY Item_ID ORDER BY B_ID) BRowID
FROM
    Table_B) BValues ON AValues.Item_ID = BValues.Item_ID AND AValues.ARowID = BValues.BRowID