如何连接两个表,其中连接列中的值不同但顺序相同

问题描述 投票:0回答:1

我有 2 张桌子 - 表 A 和表 B。

表A: 合同编号|等级编号 |价格

表B: 合同编号 |序列号 |音量

我可以使用契约编号列来连接这两个表,但我也想使用表 A 中的层编号来连接表 B 中的序列编号,尽管它们填充了不同的值。但我所知道的是顺序是相同的。

例如:在表 A 中,对于合同编号 #478 ,我的层编号为 1,2,3 (始终从 1 开始) 但在表 B 中,对于合同号#478,序列号是 8,9,10。因此,虽然数字不同,但我知道表 B 中的 8 实际上是表 A 中的 1,9 是 2,10 是 3。

我可能需要找到一种方法,对于每个合约编号组,SQL 识别表 B 中该合约编号的最小序列号并将其设为 1,然后循环遍历该组以使下一个为 2,下一个为 3等等。然后我可以使用这个转换后的列来连接表 A 和表 B。

但我不知道如何继续

尝试寻找方法来做到这一点,互联网上说递归 CTE,但我找不到在这里使用它的方法

sql mysql sql-server tsql recursive-query
1个回答
0
投票

您可以为此使用 CTE(或子查询)和“窗口函数”(下面适用于 mySQL 和 SQL Server):

create table TableA (ContractNum int, TierNum int, Price int);
create table tableB (ContractNum int, SequenceNum int, Volume int);

insert into TableA (ContractNum, TierNum, Price) values
(478,1, 100),
(478,2, 101),
(478,3, 102),
(479,6, 200),
(479,7, 201),
(479,8, 202);

insert into TableB (ContractNum, SequenceNum, Volume) values
(478,7, 10),
(478,8, 11),
(478,9, 12),
(479,3, 20),
(479,4, 21),
(479,5, 22);

with t1 as 
  (select ContractNum, TierNum, Price,
  row_number() over (partition by ContractNum order by TierNum) as rowNum
  from tableA),
t2 as
  (select ContractNum, SequenceNum, Volume,
  row_number() over (partition by ContractNum order by SequenceNum) as rowNum
  from tableB)
select t1.ContractNum, t1.TierNum, t1.Price, t2.SequenceNum, t2.Volume
from t1
inner join t2 on t1.ContractNum=t2.ContractNum and t1.RowNum=t2.Rownum;



合约编号 层数 价格 序列号 音量
478 1 100 7 10
478 2 101 8 11
478 3 102 9 12
479 6 200 3 20
479 7 201 4 21
479 8 202 5 22

DBfiddle 演示

© www.soinside.com 2019 - 2024. All rights reserved.