【发布时间】:2021-02-26 10:45:36
【问题描述】:
我想做的是具有以下逻辑的东西:
IF EXISTS (SELECT * FROM people WHERE ID = 168)
THEN UPDATE people SET calculated_value = complex_queries_and_calculations
WHERE ID = 168
..,因此如果该记录包含给定数据,则更新给定记录的字段,否则不执行任何操作。要生成将用于更新的数据,我需要查询其他表的值并进行一些计算。如果实际上没有什么可更新的,我想避免这些查询+计算。在这种情况下,什么也不做。因此,我猜想将 EXIST 子句放在 UPDATE 语句的 WHERE 子句中会导致许多查询和计算徒劳无功。
我怎样才能有条件地只更新而不做任何事情,并确保仅在需要更新时才进行计算用于更新的值所需的所有查询 + 计算?然后,最后只在complex_queries_and_calculations不为NULL时才更新?
到目前为止,我最好的解决方案是使用公用表表达式(WITH 子句),这样就不可能发生短路。无论如何,这样你就可以理解我想要实现的逻辑,我正在展示我到目前为止一直在尝试的东西(没有成功;下面的代码不起作用,我不知道为什么..):
-- complex queries and calculations; return result as t.result
WITH t AS(complex queries and calculations)
UPDATE target_table
SET
CASE
WHEN t.result IS NOT NULL
THEN target_table.target_column = t.result WHERE target_table.PK = 180
END;
更新(仍然说语法错误,仍然无法正常工作)
WITH t AS(complex_queries_and_calculations AS stamp)
UPDATE target_table
SET target_column =
CASE
WHEN t.stamp IS NULL
THEN target_column
ELSE t.stamp
END
WHERE ID = 168;
甚至这都不起作用(仍然在 UPDATE 行报告语法错误):
WITH t AS(complex_queries_and_calculations AS stamp)
UPDATE target_table
SET target_column = target_column
WHERE ID = 168;
(避免冗余 target_column = target_column 更新的最终更好的方法欢迎)
选择它可以工作,所以我完全不理解它为我的更新查询返回的语法错误 #1064:
WITH t AS(complex_queries_and_calculations AS stamp)
SELECT
CASE
WHEN t.stamp IS NULL
THEN "Error!"
ELSE t.stamp
END
FROM t;
附加信息
看起来 MariaDB 实际上不支持 CTEs 和 UPDATE 语句;如果我错了,请纠正我......所以我尝试了以下方法:
UPDATE people AS p
INNER JOIN (queries_and_calculations AS result) t
ON p.ID <> t.result -- just to join
SET p.target_column = t.result
WHERE p.ID = 168
AND t.result IS NOT NULL;
现在它在说:
#4078 - Illegal parameter data types varchar and row for operation '='
【问题讨论】:
-
您必须为整个查询提供示例数据,以便社区能够为您提供帮助。
-
从更新关键字开始,查询完全按照原样,请关注该部分/如何使其工作
标签: sql sql-update mariadb common-table-expression mariadb-10.3