SQL - 没有JOIN的UPDATE CASE

时间:2018-01-25 01:05:06

标签: sql sql-server tsql case esri

这里有点新手。我正在尝试在SQL Server中的esri sde数据库的版本化视图(表' v')上编写更新查询。我使用从其他流程收集的数据更新视图,并将其存储在表格'。

视图有一个而不是更新触发器,所以我使用子查询创建了这个查询,以避免加入视图,这会产生触发器的错误。

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的一部分。因此,我一直在努力想出办法解决这两个问题:

  1. 有没有办法让这个CASE语句有效?
  2. 如果不是,我应该以不同的方式处理这个问题,例如IF..ELSE或CURSOR?

2 个答案:

答案 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”

这种解释是错误的。当WHEREj.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