【问题标题】:sql delete double valuesql删除双值
【发布时间】:2015-02-19 11:06:21
【问题描述】:

我有一个包含双重数据的数据库,现在我不想删除双重数据。

我可以用这个查询过滤双精度值:

SELECT model, count(model), max(product_id) as latest FROM sn1_product GROUP BY model HAVING COUNT(model) > 1

查询的输出如下:

如何编写删除最新 id 的删除查询?

【问题讨论】:

  • 如果有平局?
  • product_id 是唯一的吗?根据上下文,每个模型看起来都一样。这张表有PK吗?
  • 如果有 3 行或更多行具有相同的模型?

标签: mysql sql select sql-delete


【解决方案1】:

类似的东西呢:

DELETE FROM `sn1_product` 
WHERE product_id IN (
   SELECT  max(product_id) as latest FROM sn1_product 
   GROUP BY model HAVING COUNT(model) > 1
)

但是,某些数据库(例如:MySQL)在从您选择的同一个表中删除时会出现问题。如果您有此问题,请查看答案of this question

更新:来自 cmets 的解决方法:

  1. 创建表 (reference)

    CREATE TABLE sn2_product AS
    SELECT * FROM sn1_product;
    
  2. 只保存您需要的内容(注意 min 函数 - info)。... 是其余字段。不要忘记复制非重复项

    INSERT INTO sn2_product
    SELECT  min(product_id),... FROM sn1_product 
       GROUP BY model HAVING COUNT(model) > 1
    
    INSERT INTO sn2_product
    SELECT  * FROM sn1_product 
       GROUP BY model HAVING COUNT(model) = 1
    

希望对你有帮助

【讨论】:

  • @triclosan: 是的,否则行 ID 必须在选择中作为第一个值(我认为)
  • @urban 查询不起作用,我遇到的错误是:#1093 - You can't specify target table 'sn1_product' for update in FROM 子句我该如何解决这个问题?跨度>
  • @justkidding96:这是 Rory Thoman 提到的问题,在我链接到的帖子中得到了解决。我没有 sql atm,所以我无法提供更多帮助......另外,最后一个解决方法:创建表的克隆,从旧表中选择并插入新表。可能是最快的解决方案...
【解决方案2】:

我无法真正说出此查询的目的,因此很难为您提供一种方法来做您想做的事,但我会尽力提供帮助。

据我所知,您不能从查询表中删除数据,只能在创建表脚本中删除数据。

以这种方式过滤它的问题是它仍然计算并查看双重数据,因此无论如何都需要额外的时间才能被删除,而不是您可以使用术语 distinct 它只会获取每个唯一值的第一个实例。

另外作为一个额外的想法,应该不可能在一个表中创建双重数据,主键应该是不可能的双重数据。

ps:我不是专家,这只是我的想法,如果我错了,我很抱歉,只是试图提供一些我的知识。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多