【问题标题】:Multiple-table UPDATE with WHERE not workingWHERE 不工作的多表更新
【发布时间】:2019-06-04 16:03:08
【问题描述】:

有人能帮我理解为什么下面的 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 服务器版本相对应的手册 'UPDATE holdings h JOIN subt ON h.portfolio = 附近使用的语法 subt.portfolio AND h.isin ' 在第 10 行

虽然下面的 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 数据库

【问题讨论】:

  • doc on WITH 仅显示 SELECT,而不是 UPDATE。 MySQL 8.0 也允许 WITHUPDATEDELETE

标签: mysql sql-update mariadb


【解决方案1】:

你可以尝试在子查询上使用普通的内连接来代替 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2012-12-29
    相关资源
    最近更新 更多