【问题标题】:MySQL delete rows with subqueryMySQL删除带有子查询的行
【发布时间】:2013-11-21 11:05:19
【问题描述】:

我想从我的链接表中删除重复的行。这里的选择查询确实有效:

SELECT *
from LINKS t1
WHERE EXISTS (
    SELECT *
    from LINKS t2
    where t2.cntid = t1.cntid
        and t2.title= t1.title
        and t2.lnkid > t1.lnkid
);

当我将相同的查询更改为删除时:

    DELETE from LINKS t1
WHERE EXISTS (
    SELECT *
    from LINKS t2
    where t2.cntid = t1.cntid
        and t2.title= t1.title
        and t2.lnkid > t1.lnkid
);

它不再起作用并指出:ERROR 1064 (42000): You have an error in your SQL syntax

这里有什么问题?有人可以帮忙解决查询吗?

【问题讨论】:

  • 因为DELETESELECT 有不同的语法,不是吗?..

标签: mysql subquery delete-row


【解决方案1】:

您只能使用JOIN 而不使用EXISTS 和内联视图,如下所示:

DELETE t1
FROM LINKS t1, LINKS t2
WHERE t2.cntid = t1.cntid
    AND t2.title= t1.title
    AND t2.lnkid > t1.lnkid

这比使用EXISTS 更快。当然,你的 SELECT 可以这样转换。

SELECT *
from LINKS t1, LINKS t2
WHERE t2.cntid = t1.cntid
    AND t2.title= t1.title
    AND t2.lnkid > t1.lnkid

如果你尝试删除,请set autocommit = '0'

【讨论】:

  • 谢谢,删除查询现在可以工作了。但是,由于有几百万个重复行,删除查询现在运行了一个多小时,而且看不到结束。我能以某种方式加快速度吗?
  • @sub 难以打字。我正在使用智能手机,而且我的英语不好。你能试试我对其他问题的回答吗?我真的很想知道这个答案可以改善您。请让我知道。 stackoverflow.com/questions/19929000/…
【解决方案2】:

试试:

DELETE t1 from LINKS t1 
   WHERE EXISTS (SELECT * from (select * from LINKS) t2 
                   where t2.cntid = t1.cntid 
                   and t2.title= t1.title 
                   and t2.lnkid > t1.lnkid);

SQLFiddle demo

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    相关资源
    最近更新 更多