【转】sql解惑-跟踪投资组合问题

本文探讨了一个在投资组合系统中处理循环引用问题的方法。通过设计表结构和引入嵌套集合代码,实现了一个解决方案,允许追踪投资组合间的前后继关系,包括替代关系、日期记录和审计追踪。此外,文章提供了SQL代码示例,展示了如何通过这些方法有效地管理投资组合数据,避免循环引用并方便数据检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   这个谜底是给你的。 或许我是只见树木, 不见森林, 但是如果想以一种不会导致无数循环引用的优雅方式来解决问题这个问题, 似乎并不容易。 
    这个谜底似乎是一个关于完整的系统, 但我的问题是: 是否存在一个方法, 在表设计阶段消除明显的循环引用。
    你必须记录一个组织中的投资问题, 以备查找、检索。 这个投资组合有很多附加属性, 这里只列出一些与此谜题相关的属性:   
create table Portfolios 

file_id integer not null primary key, 
issue_date date not null, 
superseded_file_id integer not null references Portfolios(file_id), 
supersedes_file_id integer not null references Portfolios(file_id) 
); 
下面的谜底: 
1.需要记录那一个投资组合代替了当前的投资组合 
2.需要记录这个投资组合替代的是那一种投资组合 
3.需要能够恢复某一个投资组合(这个做的结论会替代一个或一系列投资组合, 并导致循环引用。) 
4.因为issue_date的存在,能够记录日期, 但那时如果恢复某个投资组合,那就又一个难题! 
5.不论select语句上的投资组合是什么, 都能够select出最新的投资组合。 
6.需要能够对一些的文档重新生成审计追踪。 

方法#1 
因为在谜底的说明中无意表达式“前驱”和“后驱”的说法, 所以可知这个问题是处理序数计数的。让我们应用已知的嵌套集合代码代替它。 
    首先, 创建一个表, 容纳每个文件的所有信息: 
    create table Portfolios( 
        file_id  integer not null primary key, 
        other_stuff varchar2(40) not null 
    ); 
向Profolios表中插入数据

Sql代码   收藏代码
  1. insert into portfolios values(222,'stuff');  
  2. insert into portfolios values(223,'old stuff');  
  3. insert into portfolios values(224,'new stuff');  
  4. insert into portfolios values(225,'borrowed stuff');  
  5. insert into portfolios values(322,'blue stuff');  
  6. insert into portfolios values(323,'purple stuff');  
  7. insert into portfolios values(324,'red stuff');  
  8. insert into portfolios values(325,'green stuff');  
  9. insert into portfolios values(999,'yellow stuff'); 
  然后创建一个表容纳文档的后继,并包含两个特殊的列: chain 和next 
Sql代码   收藏代码
  1. create table Succession(  
  2.     chain integer not null ,  
  3.     next integer default 0 not null,  
  4.     file_id integer not null references Portfolios(file_id),  
  5.     suc_date date not null,  
  6.     primary key(chain, next)  
  7. );  

向succession表中插入数据 
Sql代码   收藏代码
  1. insert into Succession values(1,(select count(*) from Succession where chain=1),222,to_date('2007-11-1','yyyy-mm-dd'));  
  2. insert into Succession values(1,(select count(*) from Succession where chain=1),223,to_date('2007-11-2','yyyy-mm-dd'));  
  3. insert into Succession values(1,(select count(*) from Succession where chain=1),224,to_date('2007-11-4','yyyy-mm-dd'));  
  4. insert into Succession values(1,(select count(*) from Succession where chain=1),225,to_date('2007-11-5','yyyy-mm-dd'));  
  5. insert into Succession values(1,(select count(*) from Succession where chain=1),999,to_date('2007-11-25','yyyy-mm-dd'));  
  6.   
  7. insert into Succession values(2,(select count(*) from Succession where chain=2),322,to_date('2007-11-1','yyyy-mm-dd'));  
  8. insert into Succession values(2,(select count(*) from Succession where chain=2),323,to_date('2007-11-2','yyyy-mm-dd'));  
  9. insert into Succession values(2,(select count(*) from Succession where chain=2),324,to_date('2007-11-4','yyyy-mm-dd'));  
  10.   
  11. insert into Succession values(2,(select count(*) from Succession where chain=2),322,to_date('2007-11-5','yyyy-mm-dd'));  
  12. insert into Succession values(2,(select count(*) from Succession where chain=2),323,to_date('2007-11-12','yyyy-mm-dd'));  
  13. insert into Succession values(2,(select count(*) from Succession where chain=2),999,to_date('2007-11-25','yyyy-mm-dd'));  


选出最新组合,无论组合怎样变化,我都能选出最新的组合:通过某个组合的max(next)找到file_id, 然后找到Portfolios就可以 
Sql代码   收藏代码
  1. select distinct * from Succession s, Portfolios p  
  2. where s.file_id =p.file_id and next=  
  3. (select max(nextfrom Succession s2  
  4. where s.chain=s2.chain);  


完成审计功能: 通过chain, next排序就可以得到新顺序的投资计划了 
Sql代码   收藏代码
  1. select chain , next ,p1.file_id, other_stuff , suc_date  
  2. from succession s1,portfolios p1  
  3. where s1.file_id=p1.file_id  
  4. order by chain, next;  


记录这个投资组合组合替代哪个投资组合 
Sql代码   收藏代码
  1. select s1. file_id , f2.file_id  
  2. from succession s1, succession s2  
  3. where s1.chain=s2.chain  
  4. and s1.next=s2.next+1 and s1.file_id=999;  

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26263898/viewspace-708789/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26263898/viewspace-708789/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值