视图有一个而不是更新触发器,所以我使用子查询创建了这个查询,以避免加入视图,这会产生触发器的错误。
UPDATE v
SET v.ma =
(SELECT j.mc FROM j
WHERE j.key = v.key
AND j.ma <> j.mc);
除了在&#39; j.mc&#39;中有空记录外,此查询有效。我不想更新&#39; v.ma&#39;
我试图使用这个CASE语句解决这个问题。
UPDATE v
SET v.ma =
(CASE
WHEN j.mc IS NOT NULL AND j.ma <> j.mc
THEN (SELECT j.mc FROM j WHERE j.key = v.key)
ELSE j.ma
END)
FROM j;
不幸的是,我对这个CASE语句有两个问题。一,隐含加入&#39; v&#39;和&#39; j&#39;这会在触发器中产生错误。二,子查询返回多个值,不允许作为CASE的一部分。因此,我一直在努力想出办法解决这两个问题:
答案 0 :(得分:0)
我认为您的更新声明存在问题。试试以下。
UPDATE v
SET ma =
(CASE
WHEN j.mc IS NOT NULL AND j.ma <> j.mc
THEN j.mc
ELSE j.ma
END)
FROM v
left join j on
v.key = j.key
或者
UPDATE v
SET ma =
(CASE
WHEN j.mc IS NOT NULL AND j.ma <> j.mc
THEN (SELECT top 1 j.mc FROM j WHERE j.key = v.key)
ELSE j.ma
END)
答案 1 :(得分:0)
这是您的更新:
UPDATE v
SET v.ma = (SELECT j.mc
FROM j
WHERE j.key = v.key AND j.ma <> j.mc
);
此查询有效,但“j.mc”中有空记录,我不想更新“v.ma”
这种解释是错误的。当WHERE
为j.mc
时,NULL
子句会过滤掉任何情况。相反,查询不返回任何行。
处理此问题的传统方法是将其过滤掉。由于您使用的是相关子查询,因此exists
中的where
是一个解决方案:
UPDATE v
SET v.ma = (SELECT j.mc
FROM j
WHERE j.key = v.key AND j.ma <> j.mc
)
WHERE EXISTS (SELECT 1
FROM j
WHERE j.key = v.key AND j.ma <> j.mc
);
如果j.mc
确实可以NULL
,则可以将其表达为:
WHERE (SELECT j.mc
FROM j
WHERE j.key = v.key AND j.ma <> j.mc
) IS NOT NULL