首页 > 解决方案 > 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 数据库

标签: mysqlsql-updatemariadb

解决方案


您可以尝试在子查询上使用普通的内部联接,而不是 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

推荐阅读