ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【转】sql解惑-跟踪投资组合问题

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

原创 Linux操作系统 作者:潇潇西湘 时间:2011-10-08 22:20:46 0 删除 编辑
   这个谜底是给你的。 或许我是只见树木, 不见森林, 但是如果想以一种不会导致无数循环引用的优雅方式来解决问题这个问题, 似乎并不容易。 
    这个谜底似乎是一个关于完整的系统, 但我的问题是: 是否存在一个方法, 在表设计阶段消除明显的循环引用。
    你必须记录一个组织中的投资问题, 以备查找、检索。 这个投资组合有很多附加属性, 这里只列出一些与此谜题相关的属性:   
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/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 点点滴滴
下一篇: 数据库优化1
请登录后发表评论 登录
全部评论

注册时间:2011-09-10

  • 博文量
    9
  • 访问量
    7614