我想做的是具有以下逻辑的东西:
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 更新的最终更好的方法欢迎)
使用 select 它可以工作,所以我完全不理解它为我的更新查询返回的语法错误 #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 实际上不支持CTE
s withUPDATE
语句;如果我错了,请纠正我......所以我尝试了以下方法:
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 '='