【SQL解惑】谜题7:跟踪投资组合

解惑一:

--创建数据源
create table Porfolios
(
       file_id_1 integer not null primary key ,
       stuff_1 char ( 15 ) not null
)
insert into Porfolios ( file_id_1 , stuff_1 )
values
( 222 , 'stuff' ),
( 223 , 'old stuff' ),
( 224 , 'new stuff' ),
( 225 , 'borrowed stuff' ),
( 322 , 'blue stuff' ),
( 323 , 'purple stuff' ),
( 324 , 'red stuff' ),
( 325 , 'green stuff' ),
( 999 , 'yellow stuff' )
create table Succession
(
       chain integer not null,
       next_1 integer not null,
       file_id_1 integer not null references Porfolios ( file_id_1 ),
       suc_date date not null,
        primary key ( chain , next_1 )
)
insert into Succession ( chain , next_1 , file_id_1 , suc_date )
values
( 1 , 0 , 222 , '2017-11-01' ),
( 1 , 1 , 223 , '2017-11-02' ),
( 1 , 2 , 224 , '2017-11-04' ),
( 1 , 3 , 225 , '2017-11-05' ),
( 1 , 4 , 999 , '2017-11-25' ),
( 2 , 0 , 322 , '2017-11-01' ),
( 2 , 1 , 323 , '2017-11-02' ),
( 2 , 2 , 324 , '2017-11-04' ),
( 2 , 3 , 322 , '2017-11-05' ),
( 2 , 4 , 323 , '2017-11-12' ),
( 2 , 5 , 999 , '2017-11-25' )

---不论select语句上的投资组合是什么,都能够select出最新的投资组合
select distinct p1 . file_id_1 , stuff_1 , suc_date
from Porfolios as p1 , Succession as s1
where p1 . file_id_1 = s1 . file_id_1
and next_1 = ( select max ( next_1 ) from Succession as s2 where s1 . chain = s2 . chain )
----需要能够对一系列文档重新生成审计痕迹
select chain , next_1 , p1 . file_id_1 , stuff_1 , suc_date
from Porfolios as p1 , Succession as s1
where s1 . file_id_1 = p1 . file_id_1
order by chain , next_1
----需要记录这个投资组合替代的是哪一个投资组合
begin
declare @my_file_id integer   ---声明一个需要查询的文档号
select s1 . file_id_1 , ' superseded ' , s2 . file_id_1 , ' on ' , s2 . suc_date
from Succession as s1 , Succession as s2
where s1 . chain = s2 . chain
and s1 . next_1 = s2 . next_1 + 1
and s1 . file_id_1 = @my_file_id
end
----需要能够恢复某个投资组合
begin
declare @old_file_id integer    ----声明一个旧文档号
declare @my_file_id integer    ----声明一个新文档号
declare @new_suc_date date      ----声明一个新文档号的日期
insert into Porfolios values ( @my_file_id , 'stciky stuff' )
insert into Succession ( chain , next_1 , file_id_1 , suc_date )
values (( select distinct chain
                 from Succession as s1
                where s1 . file_id_1 = @old_file_id ),
               ( select max ( next_1 ) + 1
                 from Succession as s1
                where s1 . chain = ( select distinct chain
                                                  from Succession as s2
                                                 where file_id_1 = @my_file_id )),
                                                 @my_file_id , @new_suc_date )
end




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值