7

我有一个标有两个字段 sesskey (varchar32,索引)和产品(int11)的表,现在我必须删除所有按 sesskey count(*) = 1 分组的行。我正在尝试一些方法,但都失败了。

例子:

delete from taged where sesskey in (select sesskey from taged group by sesskey having count(*) = 1)

sesskey 字段不能是主键,因为它重复。

4

3 回答 3

9
DELETE  si
FROM    t_session si
JOIN    (
        SELECT  sesskey
        FROM    t_session so
        GROUP BY
                sesskey
        HAVING  COUNT(*) = 1
        ) q
ON      q.sesskey = si.sesskey

你需要在这里加入。使用相关子查询将不起作用。

有关详细信息,请参阅我的博客中的这篇文章:

于 2009-12-14T17:06:52.433 回答
1

子查询应该工作

 Delete from taged 
  Where sesskey in 
     (Select sesskey 
      From taged 
      Group by sesskey 
      Having count(*) = 1)

编辑:感谢下面的@Quassnoi 评论...以上内容在 MySql 中不起作用,因为 MySql 限制引用正在更新或删除的表,在子查询中我必须使用 Join 做同样的事情...

于 2009-12-14T16:50:28.847 回答
1

或者,如果您使用的是较旧(4.1 之前)版本的 MySQL,并且无法访问子查询,则需要将数据选择到表中,然后将该表与原始表连接:

CREATE TABLE delete_me_table (sesskey varchar32, cur_total int);

INSERT INTO delete_me_table SELECT sesskey, count(*) as cur_total FROM orig_table
WHERE cur_total = 1 GROUP BY sesskey;

DELETE FROM orig_table INNER JOIN delete_me_table USING (sesskey);

现在您有一个名为的表,delete_me_table其中包含您删除的所有行的历史记录。您可以将其用于存档、趋势、其他有趣和不寻常的事情,让自己大吃一惊。

于 2009-12-14T17:04:01.223 回答