【问题标题】:Can't use inner-query [duplicate]不能使用内部查询[重复]
【发布时间】:2019-02-19 12:29:55
【问题描述】:

我正在尝试使用以下语法进行简单的更新查询:

UPDATE cl
SET cl_s="active_"
WHERE id in (
                SELECT distinct 
                    c.id 
                from
                    cl          c,
                    ac          a,
                    cl_ac       ac
                where
                    c.id=ac.cl_id
                    and
                    a.id=ac.ac_id
                    and 
                    c.cl_s="someval"
                    and 
                    a.ac_no !=""
            )
;

我得到的错误是:错误代码:1093。您不能在 FROM 子句中指定要更新的目标表

我已经阅读了提到 MySQL 无法像这样运行查询的帖子。我想知道一种将此类查询重组为有效结构的无缝方式。解决方案似乎是使用连接,但我似乎无法理解这个概念。

伪代码会很有帮助,有助于理解。像

(Main query)
where var in (subquery generating var list)

(main query) inner join (subquery generating var list) on var ???

【问题讨论】:

  • 第一步:从隐式连接转向显式连接
  • 您应该使用显式连接,也应该使用命名标准。 cl.cl_s 是什么?
  • ac.ac_no... 您将不断遇到使用此类名称难以解决的问题!
  • @dustytrash 这些愚蠢名字的原因是我不想在公共论坛上扔掉真实的名字。 Barmar,我猜你甚至没有读过我的问题。我确实提到我已经浏览了这些示例。我什至没有要求询问 - 理解这个概念而不仅仅是让菜肴轻松上桌。我想用 MySQL 了解这种结构的原因。
  • @SushantVasishta 在这种情况下,我不建议使用您的 SIN/SSN 或其他私人信息作为表/列名!

标签: mysql


【解决方案1】:

你可以在UPDATE statements in MySQL中使用JOIN

UPDATE cl
JOIN cl_ac ON cl.id = cl_ac.cl_id
JOIN ac ON cl_ac.ac_id = ac.id
SET cl.cl_s = 'active_'
WHERE cl.cl_s = 'someval' AND ac.ac_no != ''

PS:在 SQL 中对字符串文字和日期文字使用单引号。双引号可用于分隔标识符,具体取决于sql_mode

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多