mysql - WHERE 不工作的多表更新
问题描述
有人可以帮我理解为什么下面的 UPDATE 查询会产生错误吗?
WITH subt AS (
SELECT t.portfolio, s.isin, t.quantity, t.date
FROM transactions t
JOIN stocks s
ON t.stock = s.name
ORDER BY t.id DESC
LIMIT 1
)
UPDATE holdings h
JOIN subt
ON h.portfolio = subt.portfolio
AND h.isin = subt.isin
SET h.end_date = DATE_SUB(subt.date, INTERVAL 1 DAY)
WHERE h.end_date is NULL
我得到的错误:
SQL 错误 (1064):您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 10 行的“UPDATE holdings h JOIN subt ON h.portfolio = subt.portfolio AND h.isin”附近使用正确的语法
虽然低于 SELECT 工作正常:
WITH subt AS (
SELECT t.portfolio, s.isin, t.quantity, t.date
FROM transactions t
JOIN stocks s
ON t.stock = s.name
ORDER BY t.id DESC
LIMIT 1
)
SELECT h.*
FROM holdings h
JOIN subt
ON h.portfolio = subt.portfolio
AND h.isin = subt.isin
WHERE h.end_date is NULL
我正在通过 HeidiSQL 使用 MariaDB 10 数据库
解决方案
您可以尝试在子查询上使用普通的内部联接,而不是 WITH 结果
UPDATE holdings h
JOIN
(
SELECT t.portfolio, s.isin, t.quantity, t.date
FROM transactions t
JOIN stocks s
ON t.stock = s.name
ORDER BY t.id DESC
LIMIT 1
) subt
ON h.portfolio = subt.portfolio
AND h.isin = subt.isin
SET h.end_date = DATE_SUB(subt.date, INTERVAL 1 DAY)
WHERE h.end_date is NULL
推荐阅读
- bash - 并行:如何从函数中引用多个参数
- github - 为什么 GitHub 显示不存在的图像?
- qt - 当对象变为无线程时,如何防止 QBasicTimer::stop: Failed 警告?
- r - R 在 mathjax 条件案例中闪闪发光
- angular - 角材料底片不会在几秒钟内将数据绑定到内部内容?
- java - 如何使用 Java 和 MySql 在 Json 中获取正确的日期格式
- java - 使用 gradle bootJar 而不是 jar 任务并在 Jenkins 中构建失败
- reactjs - React Redux Firebase 文件上传
- ios - 如何在iOS swift中自动登录用户?
- x86 - 如何在不使用 KVM 的情况下在 Linux 中使用 QEMU 模拟 X86 VMX?