使用if需要帮助更新语句

时间:2012-04-13 06:47:54

标签: sql-server-2008

我的表和数据如下,

declare @tApplyProgram table (myID varchar(50), programID varchar(10), stTR char(1) null)
insert into @tApplyProgram(myID,programID) values('1925','184');
insert into @tApplyProgram(myID,programID) values('4474','172');
insert into @tApplyProgram(myID,programID) values('8890','172');
insert into @tApplyProgram(myID,programID) values('5578','172');
insert into @tApplyProgram(myID,programID) values('2980','172');
insert into @tApplyProgram(myID,programID) values('2500','172');
insert into @tApplyProgram(myID,programID) values('1925','180');
insert into @tApplyProgram(myID,programID) values('5578','180');
/*
@tApplyProgram keep applicant and their programID
myID and programID is unique
*/

declare @tResult table (myID varchar(50), subjectCd varchar(50))
insert into @tResult values('1925','01')
insert into @tResult values('1925','02')
insert into @tResult values('1925','03')
insert into @tResult values('4474','03')
insert into @tResult values('4474','04')
insert into @tResult values('4474','05')
insert into @tResult values('5578','01')
insert into @tResult values('5578','02')
insert into @tResult values('5578','03')
insert into @tResult values('2980','01')
insert into @tResult values('2980','02')
/*
@tResult keep their applicant's result
myID and subjectCd is unique
*/


declare @tRulesD table (programID varchar(50), subjectCd varchar(50))
insert into @tRulesD values('172','05')
insert into @tRulesD values('172','02')
insert into @tRulesD values('172','15')
insert into @tRulesD values('184','01')
insert into @tRulesD values('184','02')
insert into @tRulesD values('184','03')
/*
@tRulesD keep programID rules and regulation
programID and subjectCd is unique
*/

如果要应用的programID(@tApplyProgram)满足要求(@tRulesD),则设置stTR = 1。如果不符合要求,请设置stTR = 0。否则将其保留为NULL

预期结果如下所示,

myID  | programID  | stTR
------------------------------------
1925    184          1           /*1925 have rows in @tResult, and 184 have rows in @tRulesD. And, it's meet the requirements */
4474    172          0           /*4474 have rows in @tResult, and 172 have rows in @tRulesD. But, it's not meet the requirements */
8890    172          NULL        /*8890 don't have rows in @tResult*/
5578    172          0           /*5578 have rows in @tResult, and 172 have rows in @tRulesD. But, it's not meet the requirement*/
2980    184          0           /*2980 have rows in @tResult, and 184 have rows in @tRulesD. But. it's not meet the requirement*/
2500    172          NULL        /*2500 don't have rows in @tResult*/
1925    180          NULL        /*180 don't have rows in @tRulesD*/
5578    180          NULL        /*180 don't have rows in @tRulesD*/

真的需要帮助来构建T-SQL。我被困了

2 个答案:

答案 0 :(得分:0)

此查询可能会对您有所帮助,我只是不明白“不符合要求”意味着:

select  myID, programID, 
        case 
            when (
                  (select case WHEN COUNT(*)>1 then 1 else null end from @tResult where myid=p.myid) +
                  (select case WHEN COUNT(*)>1 then 1 else null end from @tRulesD where programid=p.programid)
                 )>1 then 1 else null end 
from @tApplyProgram P

答案 1 :(得分:0)

这是更新的子查询版本。它的工作原理是分别从给定myid和programid的结果和规则连接子查询,并通过subjectid列连接完全外连接。然后测试该结果集的空值(未命中)。如果有错过最大将返回1;如果所有值都匹配,则返回值将为0.这对双方都有效。如果没有未命中总和会给0,我们返回1。 如果我们发现未命中,我们仍然需要确定每列的所有值是否为空。我们通过使用count测试非空值来实现;如果找到,count将给1,如果不是,它将给出0。如果双方都至少有一个非空值,我们知道规则和结果都有匹配的行,所以我们返回0.如果不是,返回值为空。

update @tApplyProgram
set stTR = 
(
  select
    case when max (case when u.subjectcd is null then 1 else 0 end) 
            + max (case when r.subjectcd is null then 1 else 0 end)
            = 0
         then 1
         else case when count (u.subjectcd) > 0
                    and count (r.subjectcd) > 0
                   then 0 
                   else null 
               end

     end
    from (select * from @tResult r where r.myid = [@tApplyProgram].myid) r
    full outer join
         (select * from @tRulesD u where u.ProgramID = [@tApplyProgram].programid) u
     on r.subjectCd = u.subjectCd
)