我正在尝试创建一个查询,该查询将获取我们数据库中帐户的完整交易记录。这种关系相当简单,'loanaccount'加入'loantransactions',我可以看到该帐户的完整历史记录。
但是,某些帐户将进行再融资或重新安排,并且对于完整的贷款交易历史记录,我还需要链接到之前的帐户。完成再融资/重新安排时,系统会在旧帐户和新帐户上创建“转移”活动,我一直在探索这种方式来链接它们。
我的尝试很大程度上与在事务表中使用parenttransactionkey有关 - 这是一个返回到事务表的外键,它链接了已创建的两个“Transfer”活动。例如:
select
la.id,
la2.id
from loanaccount la
join loantransaction lt on lt.PARENTACCOUNTKEY = la.ENCODEDKEY
join loantransaction lt2 on lt2.PARENTLOANTRANSACTIONKEY = lt.ENCODEDKEY
join loanaccount la2 on lt2.PARENTACCOUNTKEY = la2.ENCODEDKEY
Where
lt.type = 'TRANSFER'
在上面的例子中,la.id会给我新的帐户ID,la2.id会给我一个旧的帐户ID。可以有任意数量的以前的帐户,我不知道如何能够继续加入到第n级的解决方案 - 因为只有1个新帐户和1个旧帐户才能使用。
给出我想要实现的目标的详尽例子:
loanaccount
encodedkey id accountstate
a1a1a1 a1 active
b2b2b2 b2 closed
c3c3c3 c3 active
d4d4d4 d4 closed
e5e5e5 e5 closed
CREATE TABLE `loanaccount` (
`encodedkey` VARCHAR(32) NOT NULL,
`id` VARCHAR(32) NULL,
`accountstate` VARCHAR(32),
PRIMARY KEY (`encodedkey`));
INSERT INTO ``loanaccount` (`encodedkey`, `id`) VALUES ('a1a1a1','a1','active'),'b2b2b2', 'b2','closed'),('c3c3c3', 'c3','active'),('d4d4d4','d4','closed'),('e5e5e5','e5','closed');
loantransaction
encodedkey parentaccountkey amount type entrydate parentloantransactionkey
tra1 a1a1a1 1000 Interest 2017-12-31 null
tra2 a1a1a1 5000 Repayment 2017-12-01 null
tra3 a1a1a1 50000 Transfer 2017-11-15 null
tra4 b2b2b2 50000 Transfer 2017-11-15 tra3
tra5 b2b2b2 900 Interest 2017-10-30 null
tra6 b2b2b2 5000 Repayment 2017-10-01 null
tra7 b2b2b2 60000 Transfer 2017-09-15 null
tra8 d4d4d4 60000 Transfer 2017-09-15 tra7
tra9 d4d4d4 800 Interest 2017-09-30 null
tra10 c3c3c3 7500 Repayment 2018-01-31 null
tra11 c3c3c3 750000 Transfer 2018-01-01 null
tra12 e5e5e5 750000 Transfer 2018-01-01 tra11
tra13 e5e5e5 10000 Interest 2017-12-01 null
CREATE TABLE `loantransaction` (
`encodedkey` VARCHAR(32) NOT NULL,
`parentaccountkey` VARCHAR(32) NOT NULL,
`amount` DECIMAL(18,2) NULL,
`type` VARCHAR(32) NULL,
`entrydate` DATE NOT NULL
`parentloantransactionkey` VARCHAR(32) NULL),
PRIMARY KEY (`encodedkey`));
INSERT INTO loantransaction (encodedkey, parentaccountkey, amount, type, entrydate, parentloantransactionkey) VALUES ('tra1', 'a1a1a1', '1000', 'Interest', '2017-12-31', ''),('tra2', 'a1a1a1', '5000', 'Repayment', '2017-12-01', ''),('tra3', 'a1a1a1', '50000', 'Transfer', '2017-11-15', ''),('tra4', 'b2b2b2', '50000', 'Transfer', '2017-11-15', 'tra3'),('tra5', 'b2b2b2', '900', 'Interest', '2017-10-30', ''),('tra6', 'b2b2b2', '5000', 'Repayment', '2017-10-01', ''),('tra7', 'b2b2b2', '60000', 'Transfer', '2017-09-15', ''),('tra8', 'd4d4d4', '60000', 'Transfer', '2017-09-15', 'tra7'),('tra9', 'd4d4d4', '800', 'Interest', '2017-09-30', ''),('tra10', 'c3c3c3', '7500', 'Repayment', '2018-01-31', ''),('tra11', 'c3c3c3', '75000', 'Transfer', '2018-01-01', ''),('tra12', 'e5e5e5', '75000', 'Transfer', '2018-01-01', 'tra11'),('tra13', 'e5e5e5', '10000', 'Interest', '2017-12-01', '')
所以,我希望有一个查询,它会告诉我活动帐户的完整交易历史记录。因此,对于帐户ID a1,我希望看到以下内容:
loanaccount.id encodedkey parentaccountkey amount type entrydate parentloantransactionkey
a1 tra1 a1a1a1 1000 Interest 2017-12-31 null
a1 tra2 a1a1a1 5000 Repayment 2017-12-01 null
a1 tra3 a1a1a1 50000 Transfer 2017-11-15 null
a1 tra4 b2b2b2 50000 Transfer 2017-11-15 tra3
a1 tra5 b2b2b2 900 Interest 2017-10-30 null
a1 tra6 b2b2b2 5000 Repayment 2017-10-01 null
a1 tra7 b2b2b2 60000 Transfer 2017-09-15 null
a1 tra8 d4d4d4 60000 Transfer 2017-09-15 tra7
a1 tra9 d4d4d4 800 Interest 2017-09-30 null
对于帐户ID c3,我应该看到:
loanaccount.id encodedkey parentaccountkey amount type entrydate parentloantransactionkey
c3 tra10 c3c3c3 7500 Repayment 2018-01-31 null
c3 tra11 c3c3c3 750000 Transfer 2018-01-01 null
c3 tra12 e5e5e5 750000 Transfer 2018-01-01 tra11
c3 tra13 e5e5e5 10000 Interest 2017-12-01 null
我的研究表明,我可能需要创建一个程序来完成此操作,如以下链接所示:
Mysql query with recursive self JOIN
理想情况下,我想避免程序路由 - 有什么方法可以创建临时表来实现这个目标吗?
为冗长的帖子道歉,并感谢您提供的任何帮助。