【问题标题】:Delete rows which contains same data in 3 columns and different data in 1 column删除包含 3 列相同数据和 1 列不同数据的行
【发布时间】:2020-01-09 21:20:59
【问题描述】:

删除3列相同数据和1列不同数据的行

我有一个包含以下列的表格:c1、c2、c3、c4、modifyday

我想删除 c1、c2、c3 列中包含相同数据以及 c4 中具有较早修改日期的不同数据的行。

我已经编写了一个查询来删除列 c1、c2、c3 中包含相同数据的列 - 但我不确定如何检查此查询结果中 c4 中的数据是否不同。

delete c1,c2,c3, count( * )
FROM table
GROUP BY c1,c2,c3,
HAVING count( * ) >1 

【问题讨论】:

  • 您要删除两行/所有行,还是保留其中一行?
  • 我想保留最后的修改行。

标签: mysql sql


【解决方案1】:

您可以使用聚合查询连接表,该查询选择具有多个不同 c4 值的 (c1, c2, c3) 记录:

delete t
from mytable t
inner join (
    select c1, c2, c3 from mytable group by c1, c2, c3 having count(distinct c4) > 1
) g on g.c1 = t.c1 and g.c2 = t.c2 and g.c3 = t.c3

【讨论】:

  • 解析查询时出错。 [令牌行号 = 4,令牌行偏移量 = 115,错误令牌 = 不同]
  • @DevApps:这不是 MySQL 错误消息。您应该直接针对您的数据库运行查询以对其进行测试。
【解决方案2】:

使用自联接:

delete t 
from tablename t inner join tablename tt
on tt.c1 = t.c1 and tt.c2 = t.c2 and tt.c3 = t.c3 and tt.c4 <> t.c4 
and tt.modifyday > t.modifyday;

【讨论】:

  • tt.c4 &lt;&gt; t.c4?我猜tt.c4 &lt; t.c4,保留其中一行。 (但我不知道 MySQL。)
  • 没有要求保留 1 行(有没有我错过了?)/
  • 好吧,我只是猜想 OP 想要摆脱过于相似的行,即保留一个。
  • 我不这么认为。甚至发布的尝试代码也没有表明类似的情况。
  • 关于表格的更详细信息:还有一个名为“修改日”的列,我想删除最后一个修改日。
猜你喜欢
  • 2019-11-18
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多