两列重复数据删除

时间:2015-05-25 09:39:11

标签: sql ms-access access-vba

1我需要对这样的表进行重复数据删除: -

name | fix | mobile
-----+-----+---------
dan  | 1   | 1
jon  | 1   | 3
mia  | 1   | 4
ken  | 5   | 4

我想得到: -

dan  | 1   | 1
jon  |     | 3
mia  |     | 4
ken  | 5   |  

可以使用Excel,但对于500k行,我得到'not responding' 如果找到重复,则访问删除整行。

例如:  设置主键修复,我得到: -

dan  | 1  | 2
ken  | 5  | 4

mobil上设置主键,我得到: -

dan  | 1  | 1
jon  | 1  | 3
mia  | 1  | 4

SQL或其他程序可以这样做吗?我试图使用distinct或group by,但我找不到合适的公式。

4 个答案:

答案 0 :(得分:3)

在sql中是可能的。我确实写过sql code.let并说你在表中有id列,你的表名是。我编写了用于更新' 修复'的代码柱。诀窍是自己加入桌子。 如果您有任何疑问,请随时提出。

    update temp1 set temp1.fix='' 
    from people temp1 inner join people  temp2 
    on temp1.fix=temp2.fix where temp1.id>temp2.id

答案 1 :(得分:1)

使用此查询:

SELECT 
    t.NAME,
    IIF(t.partRankFix = 1, t.fix, NULL) AS fix,
    IIF(t.partRankMobile = 1, t.mobile, NULL) AS mobile
    ,A.field1, A.field2
FROM (
    SELECT 
        A.Name, A.Fix, A.mobile
        , Sum(IIF(A.fix = B.fix OR A.fix=B.mobile, 1, 0)) AS partRankFix
        , Sum(IIF(A.mobile = B.mobile AND A.mobile = B.fix, 2, 
              IIF(A.mobile = B.mobile OR A.mobile = B.fix, 1, 0))) AS partRankMobile
        , A.field1, A.field2
    FROM 
        yourTable AS A, 
        yourTable AS B
    WHERE 
        (((Nz(A.fix, 0) < Nz(B.fix, 0)) OR (Nz(B.fix, 0) = Nz(A.fix, 0))) AND (Nz(B.NAME, 0) >= Nz(A.NAME, 0)))
    GROUP BY 
        A.Name, A.Fix, A.mobile, A.field1, A.field2) AS t

答案 2 :(得分:1)

这个模块应该完成这项工作。我使用了原始表的副本(此处我将其命名为Public Function Dedup() Dim rstSource As DAO.Recordset Dim rstDestination As DAO.Recordset Dim deduppreviousValue As Long Dim dedupValue As Long Dim blnInit As Boolean Set rstSource = CurrentDb.OpenRecordset("Select * from Table1 order by Fix,Mobile") Set rstDestination = CurrentDb.OpenRecordset("dedup") With rstSource .MoveFirst blnInit = False While Not .EOF dedupValue = .Fields("fix") rstDestination.AddNew rstDestination.Fields("NameID") = .Fields("nameID") If Not blnInit Then rstDestination.Fields("fix") = .Fields("fix") blnInit = True Else If deduppreviousValue <> dedupValue Then rstDestination.Fields("fix") = .Fields("fix") Else End If End If rstDestination.Fields("mobile") = .Fields("mobile") rstDestination.Update deduppreviousValue = .Fields("fix") .MoveNext Wend End With End Function )名为dedup

C:\Windows\System32\drivers\etc\hosts.ics

答案 3 :(得分:0)

好的,我通过这个例子达到了它。

- 首先我创建一个表来处理:

CREATE TABLE #Table (field1 INT, field2 INT, field3 int)

- 然后我用类似于你的数据填写字段:

 INSERT INTO #Table VALUES(1,2,3)

 INSERT INTO #Table VALUES(2,2,4)

 INSERT INTO #Table VALUES(3,2,5)

 INSERT INTO #Table VALUES(4,3,5)

- 最后通过以下查询,您可以找到您所寻找的内容:

 SELECT t1.field1,t2.field2,t3.field3 from  #Table t1 
 left join 
 (select field2,min(field1) AS field1 from #Table group by field2) t2 
 on t1.field1 = t2.field1  left join 
 (select field3,min(field1) AS field1 from #Table group by field3) t3 
 on   t1.field1 = t3.field1

关键是要为每个要进行重复数据删除的字段使用相同的表进行左连接,并始终与相同的字段“field1”匹配。 在每个表中,您必须按要删除重复数据的字段进行分组。

希望它有所帮助。