sql从具有重复列值的多表中删除行

时间:2018-02-05 08:19:08

标签: mysql sql database

我在那篇文章之前经常搜索过,这是我的问题:

表:

table1 
table2
table3
table4
table5
table6
table7
table8
table9
table10

表1有:

id (primary key), cola, colb, colc 

在表1中,可乐重复了 cola 列值:

abc
abc

在表2中:

wid (it's id from table1), cola, colb, colc 

表3:

wid (it's id from table1), cola, colb, colc, cold

等等,所有表格内容都是wid。

我要做的是删除重复行依赖于来自table1的列 cola 并仅保留1.然后从表table2,table3,table4,table5中删除行,...与table1中已删除的重复行的id相同。

1 个答案:

答案 0 :(得分:0)

让我们看看能否提供帮助。

要查找欺骗,您可以使用分区并添加一个rownumber:

WITH FindDupes AS (
  SELECT[[id],  
     row_number() OVER(PARTITION BY cola ORDER BY id) AS [rn]
  FROM Table1
)
SELECT * FROM FindDupes WHERE [rn] > 1

通过这种方式,您可以找到所有重复的行ID。

您还可以展开查询以删除所有表格中的ID。

WITH DeleteDupes AS (
  SELECT[[id],  
     row_number() OVER(PARTITION BY cola ORDER BY id) AS [rn]
  FROM Table1
)
DELETE t1, t2, t3, t4, t5, t6, t7, t8, t9, t10 FROM
     table1 as t1
     INNER JOIN table2 as t2 on t1.id = t2.wid
     INNER JOIN table3 as t3 on t1.id = t3.wid
     INNER JOIN table4 as t4 on t1.id = t4.wid
     INNER JOIN table5 as t5 on t1.id = t5.wid
     INNER JOIN table6 as t6 on t1.id = t6.wid
     INNER JOIN table7 as t7 on t1.id = t7.wid
     INNER JOIN table8 as t8 on t1.id = t8.wid
     INNER JOIN table9 as t9 on t1.id = t9.wid
     INNER JOIN table10 as t10 on t1.id = t10.wid
WHERE t1.id in (SELECT id FROM DeleteDupes WHERE [rn] > 1)

这会留下一行重复项,并从所有10个表中删除所有其他项。 您没有指定应保留哪些重复项。如果要修改它,可以通过更改ORDER BY子句来完成此操作。要保留的应该是首先导致ORDER BY子句。