Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存在具有不同列的重复行时的SQL联接_Sql_Sql Server - Fatal编程技术网

存在具有不同列的重复行时的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”的所有记录。然后,您必须决定您想要哪个零件号,第一个还是最后一个,或者……我祝贺您根据我给出的建议进行了自己的编码。:)