这个问题在这里已经有答案了:
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
1条答案
按热度按时间hzbexzde1#
您的sql有一些问题。我会先解决这些问题,即使您的dbms没有拒绝查询。它可能会解决这个问题,因为在delete语句中,您可能最终将系统推过了它的限制。无论如何,这将澄清这个问题。
ORDER BY
在标准sql中,只允许在最外层的select子句中使用一次。它是一种按特定顺序将行返回到调用进程的方法,而不是在sql处理器内部表示顺序的方法。你额外的ORDER BY
如果不影响您的查询,请删除它们。GROUP BY
应重复select子句中未聚合的任何列名。因为你选择了book_id
,你也应该分组book_id
.我怀疑你真的需要这么多人。我不知道你想做什么,但我想你的问题可能只是
这将消除所有具有图书标识的行,{book\u id,buying\u price,selling\u price}的任何组合都不是唯一的。但我不确定那是你真正想要的。
我想从一个表“book”中删除行,在这个表中以前出现过两个列。
是的,sql中没有“before”,因为没有顺序。我认为你的意思是,如果你有3个“重复”行,你想消除额外的2。sql没有这样的操作。
sql通过 predicate 逻辑进行操作:根据行是否符合某些条件来删除行。根据定义,重复的行都满足相同的条件。因为没有顺序,所以没有删除所有匹配项的概念,除了第一个。
必须说,最好的解决方案是首先通过在表定义中正确声明唯一性来防止重复。如果做不到这一点,补救方法通常是将distinct集合插入到临时表中,在主表中删除临时集合中存在的所有集合,从临时集合插入主集合,然后删除临时表。