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

问题描述:

我不想使用游标出于性能原因。 输入参数存储过程:ARG1,ARG2,ARG3 & ARG4 例如: 表A> A1柱和A2列, 表B> B1柱(A.A1 < => B.B1)外国N个主密钥关系和B2列。SQL查询通过循环遍历表记录并检查某些逻辑来更新记录列表?

我想更新基于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具有匹配A.A1 = ARG4说,所以我有1000的记录如下应用上述逻辑或案例的所有记录,并希望避免使用游标...我该怎么做?

+0

您使用的是什么RDBMS?你是否也在使用编程语言(考虑到你的例子不是标准的SQL格式)。 – Wil

+0

那么B1是B的主键? – Neil

请尝试以下查询。

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 

希望这有助于!

+0

这完全错过了arg1 = 1和B.B2 = arg3的情况。 – Wil

+0

现在检查编辑后的查询。 – Praveen

+0

@Praveen谢谢 – DotNetDeveloper

一般情况下,非特异性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 

您可能需要一个ELSEEND之前,如果你不希望有任何值下降到(不ELSE它会设置一个不.A2至NULL)。