存在具有不同列的重复行时的SQL联接
我试图连接这两个表,但结果显示了重复的值。有没有办法做到这一点存在具有不同列的重复行时的SQL联接,sql,sql-server,Sql,Sql Server,我试图连接这两个表,但结果显示了重复的值。有没有办法做到这一点 +---------+-----------+------+------------+ | Table A | | | | +---------+-----------+------+------------+ | SeqID | ID | Part | PartNumber | +---------+-----------+------+------------
+---------+-----------+------+------------+
| Table A | | | |
+---------+-----------+------+------------+
| SeqID | ID | Part | PartNumber |
+---------+-----------+------+------------+
| 1 | ComputerA | Case | 111 |
+---------+-----------+------+------------+
| 2 | ComputerA | RAM | 222 |
+---------+-----------+------+------------+
| 3 | ComputerA | RAM | 333 |
+---------+-----------+------+------------+
+---------+-----------+------+----------+
| Table B | | | |
+---------+-----------+------+----------+
| SeqID | ID | Part | SendDate |
+---------+-----------+------+----------+
| 412 | ComputerA | Case | 2001/3/5 |
+---------+-----------+------+----------+
| 413 | ComputerA | RAM | 2001/3/5 |
+---------+-----------+------+----------+
| 414 | ComputerA | RAM | 2001/3/5 |
+---------+-----------+------+----------+
假设我们有这两张桌子
我希望结果如下
+---------+-----------+------+------------+----------+
| Table C | | | | |
+---------+-----------+------+------------+----------+
| SeqID | ID | Part | PartNumber | SendDate |
+---------+-----------+------+------------+----------+
| 412 | ComputerA | Case | 111 | 2001/3/5 |
+---------+-----------+------+------------+----------+
| 413 | ComputerA | RAM | 222 | 2001/3/5 |
+---------+-----------+------+------------+----------+
| 414 | ComputerA | RAM | 333 | 2001/3/5 |
+---------+-----------+------+------------+----------+
,但当我运行代码时
select b.seqid, b.id,b.part,a.partnumber,b.senddate from TableB b join TableA a on b.id = a.id and b.part = a.part group by b.seqid, b.id,b.part,a.partnumber,b.senddate order by b.seqid desc
我坐在桌子下面
+---------+-----------+------+------------+----------+
| Table C | | | | |
+---------+-----------+------+------------+----------+
| SeqID | ID | Part | PartNumber | SendDate |
+---------+-----------+------+------------+----------+
| 412 | ComputerA | Case | 111 | 2001/3/5 |
+---------+-----------+------+------------+----------+
| 413 | ComputerA | RAM | 222 | 2001/3/5 |
+---------+-----------+------+------------+----------+
| 413 | ComputerA | RAM | 333 | 2001/3/5 |
+---------+-----------+------+------------+----------+
| 414 | ComputerA | RAM | 222 | 2001/3/5 |
+---------+-----------+------+------------+----------+
| 414 | ComputerA | RAM | 333 | 2001/3/5 |
+---------+-----------+------+------------+----------+
我明白为什么会发生这种情况,我认为在条件方面还缺少一些东西。有什么方法可以达到我的期望吗?试试下面的方法-
SELECT B.SeqID,
A.ID,
A.Part,
A.PartNumber,
B.SendDate
FROM Table_A A
INNER JOIN (
SELECT *,ROW_NUMBER() OVER(ORDER BY SeqID) RN
FROM Table_B
)B
ON A.SeqID = B.RN
根据示例数据,实现所需结果的一种方法是为两个表中的每个表生成一个ROW_NUMBER()列,按
ID
和Part
划分,并按SeqID
排序,然后将这些行号包括在连接条件中。取决于您希望将SeqID
413连接到PartNumber
222而不是333的原因。这背后的逻辑是什么?你的表a和表B似乎没有一个有效的关系来返回你期望的结果..回答“为什么”会发生这种情况?您正在使用零件连接到表A。“RAM”部分出现在表A中的两个记录中,一次用于零件号222,另一次用于零件号333。默认情况下,联接将显示“RAM”的所有记录。然后,您必须决定您想要哪个零件号,第一个还是最后一个,或者……我祝贺您根据我给出的建议进行了自己的编码。:)