出于性能原因,我不想使用游标。 存储过程的输入参数: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匹配所以我必须对所有记录应用上述逻辑或大小写,并且希望避免使用游标......我该怎么做?
答案 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
)。