SQL查询通过循环表记录并检查一些逻辑来更新记录列表?

时间:2011-09-22 20:04:28

标签: sql

出于性能原因,我不想使用游标。 存储过程的输入参数:arg1,arg2,arg3& ARG4 例如: 表A> A1列和A2列, 表B> B1列(A.A1< => B.B1)外来n主键关系和B2列。

我想根据以下if条件更新A.A2值,

if(arg1 == B.B2 && arg2 == B.B2)
{
   Update A set A.A2 = 1 where A.A1 = arg4
}
else{ 
if(arg1 == 1 && arg3 == B.B2){
 Update A set A.A2 = 0 where A.A1 = arg4
}

}

这对于一条记录来说很简单但是表A有1000条记录与A.A1 = arg4匹配所以我必须对所有记录应用上述逻辑或大小写,并且希望避免使用游标......我该怎么做?

2 个答案:

答案 0 :(得分:1)

尝试以下查询。

 UPDATE tmp
 SET tmp.A2 =
    (CASE WHEN (tmp1.B2 == arg1 && tmp1.B2 == arg2) THEN 1 WHEN (arg1 == 1 && tmp1.B2 == arg3) THEN 0 ELSE tmp.A2)
 FROM
     A tmp
 INNER JOIN
     B tmp1
        ON tmp.A1 = tmp1.B1
 WHERE
      tmp.A1 = arg4

希望这有助于!!

答案 1 :(得分:1)

通常,非特定的SQL-92可以这样做:

UPDATE A
SET A.A2 = CASE WHEN B.B2 IN (@Arg1,@Arg2) THEN 1
            WHEN @arg1 = 1 AND B.B2 = @arg3 THEN 0 END
FROM A
JOIN B ON A.A1=B.B1
WHERE A.A1 = @arg4

如果您不希望任何值掉落,则可能需要ELSE之前END {没有ELSE它会将A.A2设置为NULL)。