Sql server 唯一左连接多对多表
我正在使用sqlserver,我有两个表,其中包含以下数据。我需要选择那些不重复的匹配行 表A:Sql server 唯一左连接多对多表,sql-server,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 | 1
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
但它显示了所有可能的记录
如何显示上面的预期结果?根据您给出的结果集,您希望B为每个A提供一条唯一的记录,忽略A中没有相应记录的B中的记录。以下操作将起作用:
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
这对我来说没什么意义。。。例如,为什么要省略,
B_ID=16
?@mostymostatacho我试图显示基于表A的所有记录,正如您所看到的,表A包含2条带103的记录,因此预期结果应该只显示2条带项目_id103的记录。是的,我得到了该部分。但是,我不知道您选择了什么标准来保留结果中的14
和15
,而不是16
。顺便说一句,在你现在编辑之后,我不明白你为什么要删掉199
。。。有一个左连接来保持它