如何删除mysql表中由同一个表中的数据指定的行(在一个表达式中)?

pjngdqdw  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(319)

这个问题在这里已经有答案了

mysql错误1093-无法在from子句中指定更新的目标表(16个答案)
两年前关门了。
我想从一个表“book”中删除行,在这个表中以前出现过两个列。
我成功地选择了应该删除的行的ID,如下所示:

SELECT all_dupes.book_id 
               FROM   (SELECT * 
                       FROM   Book as BBook  NATURAL JOIN Book as BBBook
                       WHERE  book_id NOT IN (SELECT book_id 
                                              FROM   Book as BBook NATURAL JOIN Book as BBBook
                                              GROUP  BY buying_price, 
                                                        selling_price 
                                              HAVING Count(*) = 1 
                                              ORDER  BY book_id) 
                       ORDER  BY book_id) AS all_dupes 
               WHERE  book_id NOT IN (SELECT book_id 
                                      FROM   Book as BBook NATURAL JOIN Book as BBBook
                                      GROUP  BY buying_price, 
                                                selling_price 
                                      HAVING Count(*) >= 2 
                                      ORDER  BY book_id);

…但是当我试图用

DELETE FROM Book
WHERE  book_id IN (
               <expression as above without tailing ;>   
               ) ;

我出错了 ERROR 1093 (HY000): Table 'Book' is specified twice, both as a target for 'DELETE' and as a separate source for data 我已经试过给表取别名,并将表自然地连接到它自己,就像在有关这个问题的其他问题中建议的那样。
另外,我在这里读了很多问题,但它们大多非常具体,我不知道如何通过那里提供的答案来更改我的删除查询。
为了完成这件事,我必须改变什么?拆分表达式不是一个选项(意味着不能有两个 ; ,但只有一个表达式)。
使用的数据库:mariadb

hzbexzde

hzbexzde1#

您的sql有一些问题。我会先解决这些问题,即使您的dbms没有拒绝查询。它可能会解决这个问题,因为在delete语句中,您可能最终将系统推过了它的限制。无论如何,这将澄清这个问题。 ORDER BY 在标准sql中,只允许在最外层的select子句中使用一次。它是一种按特定顺序将行返回到调用进程的方法,而不是在sql处理器内部表示顺序的方法。你额外的 ORDER BY 如果不影响您的查询,请删除它们。 GROUP BY 应重复select子句中未聚合的任何列名。因为你选择了 book_id ,你也应该分组 book_id .
我怀疑你真的需要这么多人。我不知道你想做什么,但我想你的问题可能只是

delete Book
where exists ( select 1
      from Book as B
      where B.book_id = Book.book_id
      group by B.book_id, B.buying_price, B.selling_price
      having count(*) > 1
)

这将消除所有具有图书标识的行,{book\u id,buying\u price,selling\u price}的任何组合都不是唯一的。但我不确定那是你真正想要的。
我想从一个表“book”中删除行,在这个表中以前出现过两个列。
是的,sql中没有“before”,因为没有顺序。我认为你的意思是,如果你有3个“重复”行,你想消除额外的2。sql没有这样的操作。
sql通过 predicate 逻辑进行操作:根据行是否符合某些条件来删除行。根据定义,重复的行都满足相同的条件。因为没有顺序,所以没有删除所有匹配项的概念,除了第一个。
必须说,最好的解决方案是首先通过在表定义中正确声明唯一性来防止重复。如果做不到这一点,补救方法通常是将distinct集合插入到临时表中,在主表中删除临时集合中存在的所有集合,从临时集合插入主集合,然后删除临时表。

相关问题