我的表和数据如下,
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 :(得分: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
)