2012-04-13 82 views
1

我有表和数据如下,使用需要帮助的更新语句,如果

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。我坚持

+0

为什么4474,172不符合要求?结果中有('172','05')和('4474','05')。如果要求主体之间的平等,他们应该有资格。 – 2012-04-13 09:17:27

+0

哦,你需要所有的subjectCd匹配。 – 2012-04-13 09:46:01

回答

0

这里是更新的子查询的版本。它的工作方式是将结果中的子查询和给定myid和programid的规则分别与主观列中的完整外连接相连接。然后测试此结果集的空值(未命中)。如果有错误,max将返回1;如果所有值匹配,则返回值将为0.这对双方都有效。如果没有错过总和将给0,并且我们返回1. 如果我们发现错过,我们仍然需要确定每列的所有值是否为空。我们通过使用count测试非空值来完成它;如果找到,count会给1,如果没有,它会给零。如果双方至少有一个非空值,我们知道规则和结果都有匹配的行,所以我们返回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 
) 
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