【问题标题】:Right syntax to use near ORDER BY when I try to delete some number of rows当我尝试删除一些行时,在 ORDER BY 附近使用的正确语法
【发布时间】:2020-07-30 04:34:23
【问题描述】:

当我尝试使用 ORDER BY ASC 和 LIMIT = 2 从表中删除一些行(从连接表中获取的行)(例如:如果我得到 10 条记录,则需要删除前 2 条记录)。

但出现错误

您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 9 行的“ORDER BY sales_flat_quote.entity_id ASC LIMIT 2”附近使用正确的语法

下面是我的代码:

DELETE table1,table2,table3
FROM table1
LEFT JOIN table2 on table1.entity_id=table2.quote_id
LEFT JOIN table3 on table1.entity_id=table3.quote_id
WHERE table1.entity_id <= 101
ORDER BY table1.entity_id ASC LIMIT 2;

【问题讨论】:

  • 您要删除哪些表?所有三个表?

标签: sql mariadb syntax-error sql-order-by limit


【解决方案1】:

您正在执行多表删除和文档states the following

您不能在多表 DELETE 中使用 ORDER BY 或 LIMIT。

嵌套选择最终可能会解决一些问题。检查this answer 到类似的问题。

【讨论】:

  • 这是正确答案。文档状态为'If the ORDER BY clause is specified, the rows are deleted in the order that is specified. The LIMIT clause places a limit on the number of rows that can be deleted. These clauses apply to single-table deletes, but not multi-table deletes.
  • @Philip Petrov 如果不是从 LIMIT 加入表格,有没有办法只删除 2 条记录?
  • @K4M 上述查询有什么解决方案吗?
  • 我看到你已经找到了它 - 一个嵌套选择,它对连接到其他表的行进行排序和限制。
【解决方案2】:

如果您可以接受临时表,您可以尝试这样的方法。不是一流但简单的解决方案。

CREATE TEMPORARY TABLE TempToBeDeleted (
     id_table1 INT NOT NULL
   , id_table2 INT NOT NULL 
   , id_table3 INT NOT NULL 
);

INSERT INTO (id_table1, id_table2, id_table3)
SELECT DISTINCT table1.primary_key, table2.primary_key, table3.primary_key
FROM 
    table1
    LEFT JOIN table2 ON table1.entity_id = table2.quote_id
    LEFT JOIN table3 ON table1.entity_id = table3.quote_id
WHERE table1.entity_id <= 101
ORDER BY table1.entity_id ASC LIMIT 2;

DELETE FROM table1, table2, table3
FROM
    TempToBeDeleted
    INNER JOIN table1 ON TempToBeDeleted.id_table1 = table1.primary_key
    INNER JOIN table2 ON TempToBeDeleted.id_table2 = table2.primary_key
    INNER JOIN table3 ON TempToBeDeleted.id_table3 = table3.primary_key
;

DROP TABLE TempToBeDeleted; 

【讨论】:

    【解决方案3】:

    解决方案:

    DELETE table1,table2,table3
    FROM table1
    INNER JOIN (
                SELECT entity_id 
                FROM table1
                WHERE entity_id<= 101
                ORDER BY entity_id ASC
                LIMIT 2
               ) sub1
    ON table1.entity_id=sub1.entity_id
    LEFT JOIN table2 ON table2.quote_id = table1.entity_id
    LEFT JOIN table3 ON table1.entity_id = table3.quote_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      相关资源
      最近更新 更多