【问题标题】:MySql 8 delete subquery with limitMySql 8删除限制子查询
【发布时间】:2020-07-08 02:37:43
【问题描述】:

我对这个查询有疑问:

DELETE FROM tableA
WHERE idTableA IN
(SELECT tA.idTableA
    FROM tableB tB
    LEFT JOIN tableA tA ON tB.idTableB = tA.idTableA
    WHERE tB.campoX = 100 LIMIT 1);

错误响应:错误代码:1235。此版本的 MySQL 尚不支持“LIMIT & IN/ALL/ANY/SOME 子查询”

示例数据:

表B 10 行(它是一个表主)

表A 50行(是tableB的明细表)

我想删除与主 (tableB) 相关的 tableA 的所有记录详细信息,并在 tableB 上使用条件过滤器并限制为 1 行 ( 此限制仅用于衡量一个删除行的执行时间)

MySql 版本:8

有什么想法吗? tk

【问题讨论】:

  • Idea:你能不能给我们更多的细节?就像您正在使用的 MySQL 版本/设置一样,这个错误显然提到了
  • LIMIT 没有ORDER BY 是没有意义的。从子查询中只选择一条记录的逻辑是什么?
  • '此限制仅用于衡量一个删除行的执行时间' - 将给出完全没有意义的结果。
  • @P.Salmon 为什么?不是真的吗?

标签: mysql sql join sql-delete


【解决方案1】:
DELETE tableA.*
FROM tableA 
JOIN (SELECT tA.idTableA
      FROM tableB tB
      LEFT JOIN tableA tA ON tB.idTableB = tA.idTableA
      WHERE tB.campoX = 100 LIMIT 1) USING (idTableA);

?

【讨论】:

  • LIMIT 没有ORDER BY 没有意义。
  • @TimBiegeleisen 当然。但不是我没有指定排序,是作者……也许他想删除任何一条记录……
  • 这个返回给我:错误代码:1248。每个派生表都必须有自己的别名
  • @GianfrancoFangano 给子查询添加别名,有什么问题?
【解决方案2】:

您可以使用exists来选择行(这最好处理b中多行匹配的情况),并在外部查询中直接使用limit

delete from tablea a
where exists (select 1 from tableb b where b.campox = 100 and b.idtableb = a.itablea)
order by a.idtablea
limit 1

注意,我在查询中添加了order by 子句,所以要删除的记录是明确定义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    相关资源
    最近更新 更多