使用子查询作为条件的MySQL DELETE语句
在MySQL中,DELETE语句允许您根据指定的条件删除表中的行。一种常见的情况是使用子查询来定义条件。但是,尝试这样做时遇到语法错误可能会令人沮丧。
一位用户尝试使用以下查询从term_hierarchy表中删除行:
<code class="language-sql">DELETE FROM term_hierarchy AS th WHERE th.parent = 1015 AND th.tid IN ( SELECT DISTINCT(th1.tid) FROM term_hierarchy AS th1 INNER JOIN term_hierarchy AS th2 ON (th1.tid = th2.tid AND th2.parent != 1015) WHERE th1.parent = 1015 );</code>
但是,这导致了以下错误:
<code>You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS th WHERE th.parent = 1015 AND th.tid IN ( SELECT DISTINCT(th1.tid) FROM ter' at line 1</code>
这里的问题在于MySQL的限制:不允许将要删除的表(在本例中为term_hierarchy)用于条件的子查询中。此限制阻止您在DELETE语句中自引用表。
解决方法:
为了解决此限制,您可以使用嵌套子查询,该查询引用子查询而不包含要删除的表。以下修改后的查询演示了这一点:
<code class="language-sql">DELETE e.* FROM tableE e WHERE id IN (SELECT id FROM (SELECT id FROM tableE WHERE arg = 1 AND foo = 'bar') x);</code>
通过将子查询包装在另一个子查询中(在此示例中命名为x),MySQL可以在不违反自引用限制的情况下执行删除操作。
以上是如何在MySQL DELETE语句中正确使用子查询以避免语法错误?的详细内容。更多信息请关注PHP中文网其他相关文章!