我一直在浏览各种网站和代码,但似乎没有什么能够结束我的痛苦。它们可以帮助查找和删除特定列的重复项,也可以仅从数据表中删除,而不是从基础数据库本身中删除。我想从我的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??
}
提前致谢。是的我是新手..
答案 0 :(得分:3)
这篇文章讨论了在SQL Server中删除重复行的几种方法,但我怀疑它也适用于MS Access:Removing Duplicates from a Table in SQL Server
答案 1 :(得分:3)
如果你还没有意识到,数据库引擎往往会以绝对的方式思考。如果您希望它删除一行,您必须告诉它如何识别该行。因此,主键。
话虽如此,但通常情况下,但并非总是如此,有两种方法可以做到这一点:
DELETE
仅考虑“前N行”,类似于DELETE TOP 1 FROM ...
第一种可能是可能的,但这取决于Access是否支持任何使其成为可能的语法。例如。 Microsoft SQL Server支持在SET ROWCOUNT 1
之前执行语句DELETE
,然后DELETE
将仅删除1行,然后停止。我不知道Access是否会这样做。
如果你有外键,第二个会很痛苦,但是我会在这里假装,因为你没有主键,你没有外键,所以数据完整性这不是一个真正的问题。
答案 2 :(得分:2)
答案 3 :(得分:0)
因为没有一个答案对我来说是件好事(我只是太新手了解更多知识渊博且经验丰富的人在这里所说的娴熟和技术化方式),我尝试了自己的变体来完成这项工作。我无法按照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();
}
编辑:对不起,我错过了说我确实使用了一个有主键的唯一列来完成这项工作。然而,这也可以在没有这个的情况下完成。只是一个选择问题。由于未知原因,这种方法似乎也很快..