日期:2014-05-18  浏览次数:20464 次

刚才那个SQL 这次我讲详细点
UserID flowNum Type status 
jay 1 a Y 
jolin 2 a 2 
jacket 3 a n 
zhangsan 4 a 1 
cyong 5 a n 
jay 6 a n

zhangsan 1 b 2 
cyong 2 b 1 
jay 3 b 1 
jolin 4 b n 
jacket 5 b 1 
cyong 6 b 1
 
jay 1 c n 
cyong 2 c 1 
zhangsan 3 c 1 
jolin 4 c n 
jacket 5 c 1 
jolin 6 c n 

这是一个简单的工作流程表,用户名,流程顺序,流程类型,操作状态(Y和2为已经操作,N和1为尚未操作)
当用户登录后,sql里有个where UserID =当前登录的ID
比如段落一中
jay 登录 他的状态为 Y,已经操作过,查不出任何东西,同理jolin状态为2 ,也查不出
很明显这时候流程走到了第3位了,故jacket 登录时
查出自己的信息
jacket 3 a n 
如果这个时候是zhangsan 登录的话,虽然他的状态为未操作,可是在他的上一级jacket 还未完成工作操作,所以zhangsan登录 也查不出值

简单的说就是在status不为(Y和2)的情况下,找出flowNum 最小的那一行
及用户登录后 工作流程走到自己这一步 才显示出那一行

比如第二段中 只有cyong登录后 显示出自己的信息
查出
cyong 2 b 1 
其他人登录后都查不出

第三段中 只有jay登录后 显示出自己的信息
jay 1 c n 
其他人登录后都查不出


不知道这样讲 清楚没有.


------解决方案--------------------
SQL code
--========+++++++++++++++++++++++++++++++++++==========
--======= 每天都在进步,却依然追不上地球的自传=========
--======= By: zc_0101    At:2009-08-18 09:59:18=========
--========++++++++++++++++++++++++++++++++++++=========
--> 测试数据: T
if object_id('T') is not null drop table T
create table T (UserID varchar(8),flowNum int,Type varchar(1),status varchar(1))
insert into T
select 'jay',1,'a','Y' union all
select 'jolin',2,'a','2' union all
select 'jacket',3,'a','n' union all
select 'zhangsan',4,'a','1' union all
select 'cyong',5,'a','n' union all
select 'zhangsan',1,'b','2' union all
select 'cyong',2,'b','1' union all
select 'jay',3,'b','1' union all
select 'jolin',4,'b','n' union all
select 'jacket',5,'b','1' union all
select 'jay',1,'c','n' union all
select 'cyong',2,'c','1' union all
select 'zhangsan',3,'c','1' union all
select 'jolin',4,'c','n' union all
select 'jacket',5,'c','1'
 
----------------查询------------
--自定义函数
CREATE FUNCTION F_GET(@USERID VARCHAR(100),@TYPE VARCHAR(10))
    RETURNS @TEMP TABLE(
        USERID VARCHAR(100) ,FLOWNUM INT,[TYPE] VARCHAR(10),STATUS CHAR(1)
    )
AS
BEGIN

    IF EXISTS (SELECT 1 FROM T WHERE USERID=@USERID AND STATUS IN ('Y','2') AND [TYPE]=@TYPE) 
            RETURN
    ELSE
        BEGIN
            INSERT INTO @TEMP SELECT USERID,FLOWNUM,[TYPE],STATUS FROM 
            (
                SELECT *,ROW=ROW_NUMBER() OVER (ORDER BY FLOWNUM)  FROM T  WHERE  [TYPE]=@TYPE AND STATUS IN('1','N') 
            ) T  WHERE T.ROW=1 AND T.USERID=@USERID
        END    
    RETURN
END
--正式查询

--对于type='a'的情况
SELECT * from dbo.F_GET('jay','a')
SELECT * from dbo.F_GET('JOLIN','a')
SELECT * from dbo.F_GET('jacket','a')
/*
USERID    FLOWNUM    TYPE    STATUS
jacket    3    a    n
*/
SELECT * from dbo.F_GET('zhangsan','a')
SELECT * from dbo.F_GET('CYONG','a')


--对于type='b'的情况
SELECT * from dbo.F_GET('zhangsan','B')
SELECT * from dbo.F_GET('cyong','B')
/*
USERID    FLOWNUM    TYPE    STATUS
cyong    2    b    1
*/
SELECT * from dbo.F_GET('jay','B')
SELECT * from dbo.F_GET('jolin','B')
SELECT * from dbo.F_GET('jacket','B')



--对于type='c'的情况
SELECT * from dbo.F_GET('jay','C')
/*
USERID    FLOWNUM    TYPE    STATUS
jay    1    c    n
*/
SELECT * from dbo.F_GET('cyong','C')
SELECT * from dbo.F_GET('zhangsan','C')
SELECT * from dbo.F_GET('jolin','C')
SELECT * from dbo.F_GET('jacket','C')

--删除测试数据
drop table T
drop function F_get