急:求一个实现方法。最好通过实际验证
已经存在一个表: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 行)
*/