Sql 两列重复数据消除

Sql 两列重复数据消除,sql,ms-access,vba,Sql,Ms 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行,我得到“无响应” 如果发现重复项,则访问删除整行 例: 在fix上设置主键,我

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行,我得到“无响应” 如果发现重复项,则访问删除整行

例: 在fix上设置主键,我得到:-

dan  | 1  | 2
ken  | 5  | 4
在mobil上设置主键,我得到:-


SQL或其他程序可以这样做吗?我曾尝试使用distinct或group by,但没有找到正确的公式。

这在sql中是可能的。我确实编写了sql代码。假设您的表中有id列,并且您的表名是people。我编写了更新“修复”列的代码。诀窍是把桌子和它自己连在一起。 如果你有任何问题,请随时提问

    update temp1 set temp1.fix='' 
    from people temp1 inner join people  temp2 
    on temp1.fix=temp2.fix where temp1.id>temp2.id
使用此查询:

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

这个模块应该完成这项工作。我使用了您原始表格的一个副本,我将其命名为table1,命名为重复数据消除

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

好的,我通过这个例子得出结论

-首先,我创建一个要使用的表:

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匹配。 在每个表中,必须按要消除重复数据的字段分组


希望有帮助。

那么你想返回null而不是重复的值吗?出现这种问题的原因是什么?重要的是哪个名称将保存值?是的,null而不是重复。保留哪个名称并不重要。因为它可以用于放入模块并运行它…或者将函数体放在表单按钮的单击事件中必须从按钮的单击事件中调用它…像此私有子命令0\u单击重复数据消除结束子命令您需要创建一个空表重复数据消除…只需复制粘贴您的源表只保留结构您能给我更多信息吗?只需调整第三列的代码…它没有看到它您想取消第三列…快速和肮脏的第二个函数,如重复数据消除,并从修复更改为移动,记住使用。编辑而不是。添加新…如果您有问题,请告诉我…@user2284877 I change=;。同样的问题。参见问题示例。
 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