我有 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,但我找不到在这里使用它的方法
您可以为此使用 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 |