以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]请教删除重复值的问题!  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=30938)

--  作者:gaoyong30000
--  发布时间:2013/4/7 12:00:00
--  [求助]请教删除重复值的问题!
有3个列  删除表中3列都相等的重复行 ,只保留一行   怎么弄?

--  作者:Bin
--  发布时间:2013/4/7 12:19:00
--  
这个不是很好处理,最好是当初添加的时候就限制不能重复.
目前只想到了比较笨的实现方式,这样批量循环的话很没效率.如果数据量大的话会耗时很久.我再想想看能不能想到比较好的办法.

--  作者:blackzhu
--  发布时间:2013/4/7 14:51:00
--  
试试这个代码,大量数据 没有测试过.

Dim t As Table =  Tables("表A")
t.Select(t.Rowsel,t.cols("第一列").Index)
syscmd.Filter.ShowRedundantValues
For i As Integer = t.Rows.Count -1 To 0 Step -1
    t.rows(i).Delete
Next
t.Datable.Save
t.filter = ""

--  作者:blackzhu
--  发布时间:2013/4/7 14:52:00
--  
可能会闪屏  加个停止绘制试试.
--  作者:gaoyong30000
--  发布时间:2013/4/8 10:31:00
--  
以下是引用muhua在2013-4-7 15:34:00的发言:

Dim i As Integer
For i  = DataTables("表A").DataRows.Count-1 To 0 Step -1
    Dim dr As DataRow = DataTables("表A").DataRows(i)
    Dim dr2 As DataRow = DataTables("表A").Find("第一列=\'" & dr("第一列") & "\' and 第二列=\'" & dr("第二列") & "\' and _Identify <> " & dr("_Identify"))
    If dr2 IsNot Nothing Then
        dr2.Delete
    End If
Next

 

执行了一下 卡了。。。 一直不动  代码能优化不?
--  作者:gaoyong30000
--  发布时间:2013/4/8 13:42:00
--  
 8万多条

--  作者:gaoyong30000
--  发布时间:2013/4/8 14:31:00
--  
我现在碰到一个头疼的问题 就是填充  接收表里本来就存在的数据  用filter填充后 居然还能重复填充了一次 才导致这么多数据量

Dim wbl1 As WinForm.Table = e.Form.Controls("Table1")
Dim tbl1 As Table = wbl1.Table
tbl1.DataTable.Save()

Dim v As Double
v = Tables("售后客户录入_table1").Compute("max(公里数)")
Dim d As Date
d  = Tables("售后客户录入_table1").Compute("max(进店时间)")

If e.Form.controls("textbox1").text = v  And e.Form.controls("DateTimePicker2").text = d Then
    Tables("售后客户档案_售后客户档案Table2").current.save()
    e.sender.Enabled = False
Else
    If DataTables("售后客户录入_Table1").Compute("Count(进店时间)","进店时间 >= #"& Tables("售后客户档案_售后客户档案Table2").current("最后进店日期").addyears(-1) &"# And 底盘号 = \'" & Tables("售后客户档案_售后客户档案Table2").current("底盘号") & "\'") >= 3 Then
        Tables("售后客户档案_售后客户档案Table2").current("客户等级") = "A"
    ElseIf DataTables("售后客户录入_Table1").Compute("Count(进店时间)","进店时间 >= #"& Tables("售后客户档案_售后客户档案Table2").current("最后进店日期").addyears(-1) &"# And 底盘号 = \'" & Tables("售后客户档案_售后客户档案Table2").current("底盘号") & "\'") = 2 Then
        Tables("售后客户档案_售后客户档案Table2").current("客户等级") = "B"
    ElseIf DataTables("售后客户录入_Table1").Compute("Count(进店时间)","进店时间 >= #"& Tables("售后客户档案_售后客户档案Table2").current("最后进店日期").addyears(-1) &"# And 底盘号 = \'" & Tables("售后客户档案_售后客户档案Table2").current("底盘号") & "\'") = 1 Then
        Tables("售后客户档案_售后客户档案Table2").current("客户等级") = "C"
        \'ElseIf DataTables("售后客户录入_Table1").Compute("Count(进店时间)","进店时间 >= #"& date.today.addyears(-1)&"# and 底盘号 = \'" & Tables("售后客户档案_售后客户档案Table2").current("底盘号") & "\'") <= 1 Then
        \'ElseIf DataTables("售后客户录入_Table1").Compute("Count(进店时间)","进店时间 >= #"& Tables("售后客户档案_售后客户档案Table2").current("最后进店日期").addyears(-2) &"# And 底盘号 = \'" & Tables("售后客户档案_售后客户档案Table2").current("底盘号") & "\'") = 0 Then
        \'Tables("售后客户档案_售后客户档案Table2").current("客户等级") = "无效档案"
    Else
        Tables("售后客户档案_售后客户档案Table2").current("客户等级") = "D"
    End If
   
    If (e.Form.controls("textbox1").text - v) < 7000 And (CDate(e.Form.controls("DateTimePicker2").value) - d).totaldays < 180 Then
        Tables("售后客户档案_售后客户档案Table2").current("客户等级") = "A"
    End If
   
    If Date.Today.addmonths(-3) < Tables("售后客户档案_售后客户档案Table2").current("建档日期") Then
        Tables("售后客户档案_售后客户档案Table2").current("客户等级") = "A"
    End If
   
    If Tables("售后客户档案_售后客户档案Table2").current.IsNull("编号") = True Then
        Tables("售后客户档案_售后客户档案Table2").current("客户等级") = "E"
    End If
   
    Tables("售后客户档案_售后客户档案Table2").current.save()

    Dim g As New Filler
    g.SourceTable = DataTables("售后客户档案_售后客户档案Table2") \'指定数据来源
    g.SourceCols = "底盘号,里程,最后进店日期" \'指定数据来源列
    g.DataTable = DataTables("售后客户录入_Table1")\'指定数据接收表
    g.DataCols = "底盘号,公里数,进店时间" \'指定数据接收列
    g.ExcludeExistValue =True
    g.ExcludeNullValue =False
    g.Distinct =True
    g.Append =True
    g.Fill()

 
    Dim wbl As WinForm.Table = e.Form.Controls("Table1")
    Dim tbl As Table = wbl.Table
    tbl.DataTable.Save()
   
    DataTables("售后客户档案_售后客户档案Table1").load
    Tables("售后客户档案_售后客户档案Table1").filter = "底盘号 = \'" & Tables("售后客户档案_售后客户档案Table2").Current("底盘号") & "\'"
    Tables("售后客户档案_售后客户档案Table1").Sort = "进店时间"
    e.sender.Enabled = False
End If

就是红色这段~  只要一保存 就把来源表的3000多数据 全部填充进了 接收表 不管有没重复

  g.ExcludeExistValue =True

    g.Distinct =True

这2句 貌似没起到效果!
[此贴子已经被作者于2013-4-8 14:34:03编辑过]

--  作者:gaoyong30000
--  发布时间:2013/4/9 8:52:00
--  
以下是引用muhua在2013-4-8 11:20:00的发言:

Dim i As Integer
For i  = DataTables("订单").DataRows.Count-1 To 0 Step -1
    Dim dr As DataRow = DataTables("订单").DataRows(i)
    Dim dr2 As DataRow = DataTables("订单").Find("产品=\'" & dr("产品") & "\' and 客户=\'" & dr("客户") & "\' and _Identify <> " & dr("_Identify"))
    If dr2 IsNot Nothing Then
        dr2.Delete
    End If
    Application.DoEvents   
Next

 

数据量很大吗?

很慢  一条条的在删除
[此贴子已经被作者于2013-4-9 8:56:01编辑过]

--  作者:czy
--  发布时间:2013/4/9 14:39:00
--  

这样试试:

 

Dim cmd As New SQLCommand
cmd.CommandText = "delete from {表A} where [_Identify] not in (select max([_Identify]) from {表A} group by 第一列,第二列,第三列)"
cmd.ExecuteNonQuery()
DataTables ("表A").Load()


--  作者:gaoyong30000
--  发布时间:2013/4/9 14:44:00
--  
 Microsoft Jet 数据库引擎找不到输入表或查询 \'~TMPCLP历史进店记录\'。 确定它是否存在,以及它的名称的拼写是否正确。


Dim cmd As New SQLCommand
cmd.CommandText = "delete from {历史进店记录} where [_Identify] not in (select max([_Identify]) from {历史进店记录} group by 进店时间,公里数,底盘号)"
cmd.ExecuteNonQuery()
DataTables ("历史进店记录").Load()



图片点击可在新窗口打开查看此主题相关图片如下:无标题.png
图片点击可在新窗口打开查看