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的一部分。因此,我一直在努力想出解决这两个问题的方法:
- 有没有办法使这个 CASE 语句起作用?
- 如果不是,我应该用不同的方式解决这个问题,例如 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.mc
为 NULL
时,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
这里有点新手。我正在尝试在 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的一部分。因此,我一直在努力想出解决这两个问题的方法:
- 有没有办法使这个 CASE 语句起作用?
- 如果不是,我应该用不同的方式解决这个问题,例如 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.mc
为 NULL
时,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