[英]SQL - UPDATE CASE without a JOIN
这里有点菜鸟。 我正在尝试在SQL Server中的esri sde数据库的版本化视图(表'v')上编写更新查询。 我使用从其他进程收集并存储在表'j'中的数据来更新视图。
该视图具有“而不是更新触发器”,因此我使用子查询创建了此查询,以避免加入视图,因为该视图会创建触发器并出错。
UPDATE v
SET v.ma =
(SELECT j.mc FROM j
WHERE j.key = v.key
AND j.ma <> j.mc);
该查询有效,除了“ j.mc”中有空记录我不想更新“ v.ma”
我试图使用此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语句有两个问题。 第一,有一个隐含的“ v”和“ j”联接,这会在触发器中产生错误。 二,子查询返回一个以上的值,这是CASE不允许的。 因此,我一直在努力想出解决这两个问题的方法:
我认为您的更新声明有问题。 请尝试以下。
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)
这是您的更新:
UPDATE v
SET v.ma = (SELECT j.mc
FROM j
WHERE j.key = v.key AND j.ma <> j.mc
);
该查询有效,除了“ j.mc”中有空记录我不想更新“ v.ma”
这种解释是错误的。 当j.mc
为NULL
时, WHERE
子句将过滤掉所有情况。 而是,查询不返回任何行。
解决此问题的传统方法是将其过滤掉。 因为您使用的是相关子查询,所以在where
exists
解决方案:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.