如何从ms访问数据库(C#)中删除重复的行

我一直在浏览各种网站和代码,但似乎没有什么可以结束我的痛苦。它们可以帮助查找和删除特定列的重复项,也可以仅从数据表中删除,而不是从基础数据库本身中删除。我想从我的mdb文件的表“table1”中删除重复的行。 为了使我的要求更清楚: 表中的任何列都没有主键设置(我无法承受) 我想删除所有重复的行但只有一个! (顺序没有意义) 我更喜欢从数据库中删除重复项,而不是在更新数据库本身之前首先检查是否存在这样的行(如果这是最后的手段,那是不可能的,那么这是受欢迎的) 通过重复行我的意思是不明显的行。例如,在以下示例中,仅第3行和第5行是重复的。我想删除其中的任何一个。
      Name1  Name2    Name3
      tom    dick   harry
      tom    dick   mike
      ann    sara   mike
      sara   ann    mike
      ann    sara   mike
应通过单击按钮从数据库中删除重复的行,如下所示
     private void button1_Click(object sender, EventArgs e)
     {
         deletedupes();
     }

    private void deletedupes()
    {
        OleDbConnection con = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0; Data Source=C:\hi.mdb");

        DataSet ds = new DataSet();
        OleDbDataAdapter da = new OleDbDataAdapter("select * from table1", con);
        con.Open();
        da.Fill(ds, "table1");

        // what could be rest of the code??
    }
提前致谢。是的我是新手..     
已邀请:
这篇文章讨论了删除SQL Server中重复行的几种方法,但我怀疑它也适用于MS Access:从SQL Server中的表中删除重复项     
如果你还没有意识到,数据库引擎倾向于绝对思考。如果要删除行,则必须告诉它如何识别该行。因此,主键。 话虽如此,通常(但并非总是)有两种方法可以做到这一点: 找出Access是否支持语法告诉
DELETE
只考虑“前N行”,类似于
DELETE TOP 1 FROM ...
从表中获取一个不同的数据集,删除其中的所有行,然后将不同的行插回其中 第一种可能是可能的,但这取决于Access是否支持任何使其成为可能的语法。例如。 Microsoft SQL Server支持在
DELETE
之前执行语句
SET ROWCOUNT 1
,然后
DELETE
将仅删除1行,然后停止。我不知道Access是否会这样做。 如果你有外键,第二个将是一个痛苦,但我会在这里走出困境并假设因为你没有主键,你没有外键,所以数据完整性不是真正的问题在这里     
好的,这是一个完整的黑客,但听起来这是你唯一的选择...... 从你的桌子做一个
SELECT DISTINCTROW
。删除表格中的所有记录。重新插入不同的行。 DISTINCTROW语法。     
由于没有一个答案对我来说是满足的(我只是太新手了解更多知识渊博且经验丰富的人在这里所说的succint和稍微技术化的方式),我尝试了自己的变体来完成这项工作。我无法按照
distinct
set rowcount
delete from
等命令执行操作。我无法在示例中找到完全部署的代码。所以我尝试了这个。从头开始。
    int id, k;
    private void button2_Click(object sender, EventArgs e)
    {
        OleDbConnection con = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0; Data Source=C:\hi.mdb");

        DataSet ds = new DataSet();

        OleDbDataAdapter da = new OleDbDataAdapter("select * from table2", con);
        con.Open();
        da.Fill(ds, "table2");


        for (int i = 0; i < ds.Tables["table2"].Rows.Count; i++)
        {
            DataRow row = ds.Tables["table2"].Rows[i];
            k++;
            for (int j = k; j < ds.Tables["table2"].Rows.Count; j++)
            {
                DataRow row2 = ds.Tables["table2"].Rows[j];
                if (row.ItemArray.GetValue(1).ToString() == row2.ItemArray.GetValue(1).ToString())
                {
                    if (row.ItemArray.GetValue(3).ToString() == row2.ItemArray.GetValue(3).ToString())
                    {
                        id = int.Parse(row2.ItemArray.GetValue(0).ToString());
                        deletedupes(id);
                    }
                }
            }
        }

        con.Close();
    }


    private void deletedupes(int num)
    {
        OleDbConnection con = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0; Data Source=C:\hi.mdb");

        con.Open();

        OleDbCommand c = new OleDbCommand("Delete from table2 where id =?", con);
        c.Parameters.AddWithValue("id", num);
        c.ExecuteNonQuery();

        con.Close();
    }
编辑:对不起,我错过了说我确实使用了具有主键的唯一列来完成此操作。然而,这也可以在没有这个的情况下完成。只是一个选择问题。由于未知原因,这种方法似乎也很快..     

要回复问题请先登录注册