【问题标题】:visual foxpro 9.0, how to find/get repeated recordsvisual foxpro 9.0,如何查找/获取重复记录
【发布时间】:2017-04-22 14:32:17
【问题描述】:

我有一个包含 2001233 条记录的表。 我可以使用“从 that_table 中选择不同的 *”来获取所有不重复的记录。 大概有 2001100 条记录。

如果我想检查“distinct”后消失的记录,如何将这 133 条记录放入另一个表中。

另一个问题是 将新记录从一个表追加到另一个表时,如何检查追加的记录是否已经在目标表中?

感谢您回答我的问题:)

【问题讨论】:

    标签: sql visual-foxpro foxpro dbf


    【解决方案1】:

    对于 2+ 百万行来说,这将是一个 hack 并且速度很慢,但你可以这样做:

    Select Sys(2017,'',0,3) As crc, * ;
        from myTable Into Cursor crsTemp ;
        nofilter
    
    Select * From crsTemp ;
        where crc In ;
        ( Select crc From crsTemp;
        having Count(*) > 1 ;
        group By crc) ;
        into Cursor crsDupes ;
        nofilter
    
    Select crsDupes
    Browse
    

    你应该从一开始就使用主键。

    对于第二个问题,我认为最好使用“插入”而不是附加。即:

    Insert into tableA ;
      select * from tableB t1 ;
      where not exists ( ;
          select * from tableA t2 ;
          where t1.field1 = t2.field1 and t1.field2 = t2.field2)
    

    【讨论】:

    • 感谢您的回答,非常有用。解决方案 1 很好,但包含“首次出现”记录,因此记录数超过 133。我正在尝试修改代码。我想得到看起来像是在两个表(原始一个和不同的一个)之间做差异的结果。 :)
    • 是的,它自然会超过 133。正如我已经说过的,你应该从一开始就拥有主键。在重复的情况下,哪一个是重复的有什么关系?毕竟,重复就是重复,它没有顺序。
    【解决方案2】:

    这是另一种查找重复记录的方法: 假设您不保留已删除的记录...

    select tableA
    set deleted off
    delete all
    index on <key expression> to keyfield unique
    set deleted on
    recall all
    browse for deleted
    

    此过程将删除所有记录,召回语句仅适用于索引记录,将重复项标记为已删除。

    【讨论】:

      【解决方案3】:

      试试这个检查是否有重复记录。

      SELECT colName, count(*) FROM tblName GROUP BY colName HAVING count(*) > 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 1970-01-01
        • 2019-09-24
        • 1970-01-01
        • 2016-07-03
        • 1970-01-01
        • 2014-03-18
        相关资源
        最近更新 更多