SQL - 没有 JOIN 的更新案例

SQL - UPDATE CASE without a JOIN

这里有点新手。我正在尝试在 SQL 服务器中的 esri sde 数据库的版本化视图 (table 'v') 上编写更新查询。我使用从其他进程收集并存储在 table 'j'.

中的数据更新视图

视图有一个 Instead of Update 触发器,所以我使用子查询创建了这个查询以避免加入视图,这会创建触发器并出错。

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' 的隐含连接,这会导致触发器出错。二、子查询returns多个值不允许作为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
               );

This query works except that there are null records in 'j.mc' that I do not want to update 'v.ma'

这个解释是错误的。当 j.mcNULL 时,WHERE 子句会过滤掉任何情况。相反,查询没有返回任何行。

传统的处理方法是过滤掉这些。因为你用的是关联子查询,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