首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

急实现方法。最好通过实际验证

2012-01-15 
急:求一个实现方法。最好通过实际验证已经存在一个表:t_bbb记录如下iduidnameuseridlnumberstatus1011hhhhh

急:求一个实现方法。最好通过实际验证
已经存在一个表:t_bbb     记录如下
id             uid             name                     userid           lnumber                     status    
1                 011             hhhhhh             aaa                   1                                         1    
2                 011             hhhhhh             bbb                   2                                         1    
3                 011             hhhhhh             ccc                   2                                         null    
4                 011             hhhhhh             ddd                   3                                         null    
 
5                 021             mmmmmm             bbb                   1                                         1    
6                 021             mmmmmm             aaa                   2                                         1    
7                 021             mmmmmm             eee                   3                                         null
8                 021             mmmmmm             ddd                   3                                         1    
9                 021             mmmmmm             ccc                   4                                         null    


 
10             031             vvvvvv             ccc                   1                                         null    
11             031             vvvvvv             bbb                   2                                         null    
12             031             vvvvvv             aaa                   2                                         null    
13             031             vvvvvv             ddd                   3                                         null    

14               051             mmmmmm             bbb                   1                                         1    
15               051             mmmmmm             aaa                   2                                         1    
16               051             mmmmmm             eee                   3                                         1    
17               051             mmmmmm             ddd                   3                                         1    
18               051             mmmmmm             ccc                   4                                         null    

19               061             hhhhhh             aaa                   1                                         1    


20               061             hhhhhh             bbb                   2                                         1    
21               061             hhhhhh             ccc                   2                                         1    
22               061             hhhhhh             ddd                   3                                         null    


如何列出如userid=ccc,status     is     null     and     lnumber-1的记录里uid相同     and     tatus=1的全部记录.则结果应该如下:  

在第一组uid=011的记录组里,userid=ccc的status   is   null   察看比它lnumber小1
的记录有一条(userid=aaa)而且其   status=1,所以就列出
3                 011             hhhhhh             ccc                   2                                         null    

在第二组uid=021的记录组里,userid=ccc的status   is   null   察看比它lnumber小1
的记录有二条(userid=ddd,userid=eee)而且其   status=1只有一个,不是两个,所以就不能列出来

在第三组uid=031的记录组里,userid=ccc的status   is   null   察看比它lnumber小1
的记录没有,所以就列出
10               031             vvvvvv             ccc                   1                                         null  

在第四组uid=051的记录组里,userid=ccc的status   is   null   察看比它lnumber小1
的记录有二条(userid=ddd,userid=eee)而且其   status全是1,所以就列出来
   
18               051             mmmmmm             ccc                   4                                         null    
 
在第五组uid=061的记录组里,userid=ccc的status=1   ,所以就不能列出来

在检索的时候userid是一个变量,设置为参数


[解决办法]
declare @Test table(id int, uid varchar(3), name varchar(10), userid varchar(3), lnumber int, status int)
insert @Test
select 1, 011, 'hhhhhh ', 'aaa ', 1, 1 union all
select 2, 011, 'hhhhhh ', 'bbb ', 2, 1 union all
select 3, 011, 'hhhhhh ', 'ccc ', 2, null union all
select 4, 011, 'hhhhhh ', 'ddd ', 3, null union all
select 5, 021, 'mmmmmm ', 'bbb ', 1, 1 union all
select 6, 021, 'mmmmmm ', 'aaa ', 2, 1 union all


select 7, 021, 'mmmmmm ', 'eee ', 3, null union all
select 8, 021, 'mmmmmm ', 'ddd ', 3, 1 union all
select 9, 021, 'mmmmmm ', 'ccc ', 4, null union all
select 10, 031, 'vvvvvv ', 'ccc ', 1, null union all
select 11, 031, 'vvvvvv ', 'bbb ', 2, null union all
select 12, 031, 'vvvvvv ', 'aaa ', 2, null union all
select 13, 031, 'vvvvvv ', 'ddd ', 3, null union all
select 14, 051, 'mmmmmm ', 'bbb ', 1, 1 union all
select 15, 051, 'mmmmmm ', 'aaa ', 2, 1 union all
select 16, 051, 'mmmmmm ', 'eee ', 3, 1 union all
select 17, 051, 'mmmmmm ', 'ddd ', 3, 1 union all
select 18, 051, 'mmmmmm ', 'ccc ', 4, null union all
select 19, 061, 'hhhhhh ', 'aaa ', 1, 1 union all
select 20, 061, 'hhhhhh ', 'bbb ', 2, 1 union all
select 21, 061, 'hhhhhh ', 'ccc ', 2, 1 union all
select 22, 061, 'hhhhhh ', 'ddd ', 3, null

declare @userid char(3)
set @userid= 'ccc '

select * from @Test a
where userid=@userid and status is null
and not exists (select 1 from @Test where uid=a.uid and lnumber=a.lnumber-1 and status is null)

/*

iduidnameuseridlnumberstatus
3011hhhhhhccc2NULL
10031vvvvvvccc1NULL
18051mmmmmmccc4NULL

(所影响的行数为 3 行)

*/

热点排行