MySQL Query使用递归自联接来获得完整的结果结构

时间:2018-02-02 13:21:22

标签: mysql join recursive-query

我正在尝试创建一个查询,该查询将获取我们数据库中帐户的完整交易记录。这种关系相当简单,'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

理想情况下,我想避免程序路由 - 有什么方法可以创建临时表来实现这个目标吗?

为冗长的帖子道歉,并感谢您提供的任何帮助。

0 个答案:

没有答案