使用SQL删除冗余或重复记录

数学建模三天,比二年级那次轻松多了,还打了场球,每天睡了五六个小时,不过还是很累,早上把论文交上去以后,倒头睡到下午6点。

还是蛮有收获的,下面是一些经验:

1.使用SQL删除冗余或者重复记录

由于A题给的是5个两万八千多条记录的Excel表,为了处理方便,我们都导入到Access数据库里,使用SQL查询语言处理数据。里面有一些重复的记录,但不是全部重复,大概在十几个字段里有几个不会重复,而且不能全部删除,必须得保留一条。 由于牵涉的是数据的纵向比较,以前没有做过,不知道怎么写,从网上查查,也没有查到合适的方法,后来自己琢磨出来一种方法可以删除冗余数据:

先从表里查出来哪些是冗余记录,查出重复字段,并且取重复记录主键字段的最小值,加到重复字段里存到临时表temp1中:

SELECT min(ID) AS tid,问卷编号 AS t1,Q2e AS t2,Q2g AS t3,Q2h1 AS t4,Q2j AS t5 INTO temp1 FROM 2001 WHERE Q2d=1 GROUP BY 问卷编号,Q2e,Q2g,Q2h1,Q2j HAVING count(ID)>1;

再从表里把所有冗余记录选出来,存到临时表temp2中:

SELECT * INTO temp2 FROM 2001,temp1 WHERE 问卷编号=t1 AND Q2e=t2 AND Q2g=t3 AND Q2h1=t4 AND Q2j=t5;

把主键字段在临时表temp2中(表明是重复记录),且不在temp1中(表明是冗余记录)的记录删除。如果只是删除重复数据的话,就把后面一个判断去掉就可以了。

DELETE * FROM 2001 WHERE ID IN (SELECT ID FROM temp2) AND ID NOT IN (SELECT tid FROM temp1);

其实不同的数据库软件有不同的方法,因为各个数据库有自己的SQL语言支持,有的数据库定义了自己的SQL语句或者特征字段,可以非常容易的删除重复字段。由于ACCESS对SQL的支持比较弱,既然上面的方法对ACCESS都可以适用,应该能应用于很多数据库软件。

2.Java连接ACCESS的方法

因为数据的处理语句太多,而且近似,用手工的方法太笨也太慢,我就写了一个JAVA程序来自动进行查询。还是应了那句话,磨刀不误砍柴工。

下面是JAVA连接ACCESS的设置:

try{
  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  String DBUrl="jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=dataBaseAddress";
  Connection con=DriverManager.getConnection(DBUrl,"","") ;
  Statement stmt=con.createStatement();
} catch (Exception e) {
  e.printStackTrace();
}

接着就可以像别的数据库一样执行查询了,但是最奇异的是我发现ACCESS不接受JAVA程序里带转义双引号的查询语句,查询语句里只能使用单引号。

《使用SQL删除冗余或重复记录》上有3条评论

  1. 你好,我看了你的文章很受启发,我就是想问一下,你的这些 语句可以用在excel软件中吗?我是实在不想下载 sql了.excel每个电脑几乎都有 可是 sql就不是每台都有了,如果可以 请大概告诉我一下办法可以吗? 谢谢了

回复 yoyoeve 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注