繁体   English   中英

SQL-没有JOIN的UPDATE CASE

[英]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不允许的。 因此,我一直在努力想出解决这两个问题的方法:

  1. 有没有办法使此CASE语句起作用?
  2. 如果不是,我是否应该以其他方式解决此问题,例如IF..ELSE或CURSOR?

我认为您的更新声明有问题。 请尝试以下。

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.mcNULL时, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM