首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同一个表中的Delete语句

问同一个表中的Delete语句
EN

Stack Overflow用户
提问于 2010-07-28 01:10:17
回答 5查看 25.4K关注 0票数 22

对于相关子查询,我需要根据同一表中的列条件查询同一表的delete语句。

我不能直接运行一条delete语句,并在mysql中为相关子查询检查同一个表的条件。

我想知道使用临时表是否会影响mysql的内存/性能?

任何帮助都将受到高度的感谢。

谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-28 01:26:36

您的问题真的不清楚,但我猜您有一个相关子查询,并且您在从DELETE锁定的同一个表执行SELECT时遇到了问题。例如,要删除文档的最新修订版本以外的所有版本:

代码语言:javascript
复制
DELETE FROM document_revisions d1 WHERE edit_date < 
  (SELECT MAX(edit_date) FROM document_revisions d2 
   WHERE d2.document_id = d1.document_id);

这对MySQL来说是个问题。

使用MySQL多表delete语法可以解决这些类型问题的许多示例:

代码语言:javascript
复制
DELETE d1 FROM document_revisions d1 JOIN document_revisions d2 
  ON d1.document_id = d2.document_id AND d1.edit_date < d2.edit_date;

但这些解决方案是根据具体情况设计的,因此,如果您编辑您的问题,并更具体地说明您试图解决的问题,也许我们可以帮助您。

在其他情况下,您可能是对的,使用临时表是最简单的解决方案。

票数 22
EN

Stack Overflow用户

发布于 2013-08-23 03:46:17

您可以通过将"where“查询包装为内联from表,让mysql为您创建临时表。

这个原始的查询会给你一个可怕的“你不能在FROM子句中指定用于更新的目标表”:

代码语言:javascript
复制
DELETE FROM sametable
WHERE id IN (
    SELECT id FROM sametable WHERE stuff=true
)

重写它以使用内联temp变得...

代码语言:javascript
复制
DELETE FROM sametable
WHERE id IN (
 SELECT implicitTemp.id from (SELECT id FROM sametable WHERE stuff=true) implicitTemp
)
票数 38
EN

Stack Overflow用户

发布于 2010-07-28 01:19:12

使用要删除的值创建临时表,然后在删除时将其联接到表中。在本例中,我有一个带有ID列的表“Game”。我将删除大于3的in。我将首先在临时表中收集目标,以便稍后报告它们。

代码语言:javascript
复制
DECLARE @DeletedRows TABLE (ID int)

insert
    @DeletedRows
        (ID)
select
    ID
from
    Games
where
    ID > 3


DELETE
    Games
from
    Games g
join
    @DeletedRows x
    on x.ID = g.ID  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3346068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档