【问题标题】:both as a target for 'DELETE' and as a separate source for data既作为“删除”的目标,又作为数据的单独来源
【发布时间】:2017-11-24 03:11:57
【问题描述】:

我的 SQL 是:

delete  from user 
where cid in (select  cid  from user group  by  cid   having  count(cid) > 1)
and id not in (select min(id) from  user  group by cid  having count(cid )>1)

提示错误信息:

表 'user' 被指定了两次,既作为 'DELETE' 的目标,又作为 单独的数据源

如何解决这个问题

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    你试过了吗:

    CREATE TABLE user
        (`cid` int, `username` varchar(50))
    ;
    
    INSERT INTO user
        (`cid`, `username`)
    VALUES
        (1, 'John'),
        (1, 'John'),
        (2, 'Paul'),
        (2, 'Paul'),
        (3, 'Ryan')
    ;
    
    DELETE FROM user 
     WHERE cid IN
       ( SELECT todel.cid
           FROM (SELECT * FROM user todel
                 WHERE todel.cid 
                  IN (
                           SELECT t1.cid  
                             FROM user t1
                         GROUP BY t1.cid   
                           HAVING COUNT(t1.cid) > 1
                   )
                  AND todel.cid 
                    NOT IN (
                           SELECT MIN(t2.cid)  
                             FROM user t2
                         GROUP BY t2.cid   
                           HAVING COUNT(t2.cid) > 1
                          )              
                ) as todel
       )
    

    由于对 stackoverflow 的一些研究,我发现了这一点: Delete - I can't specify target table?

    听起来和你遇到的问题一样。

    【讨论】:

    • btw:我强烈建议大家正确地格式化 SQL 语句,每当我看到我的团队中有人在没有适当转换的情况下编写代码时,他就会和我进行认真的讨论
    • 什么是格式化 SQL 语句的“正确”方式...我看到你的 SQL 中的制表符和空格的组合不适合我的家伙 ;-) 完全同意一般格式化它不过以一种可读的方式...不仅仅是单排或左对齐...
    • @Gallus:好吧,正如你所指出的。重要的是,它应该是可读的。应该很容易看到支架在哪里打开和关闭。对属于同一选择的行进行分组,对这些行使用相同的移位,依此类推。不幸的是,大多数人都懒得这样做
    • @yjcylyetz 我更新了我的声明并添加了一个链接。也看看链接。可能和你有同样的问题
    • @yjcylyetz 但我认为该声明不会删除任何内容。带有 NOT IN ... MIN ...have COUNT() > 1 的第二个语句将返回与 IN ...COUNT() > 1 语句相同的 ID,还是我完全错了?
    猜你喜欢
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多