博文
如何找出数据库中为空的记录(2008-02-25 08:33:00)
摘要:目前想要的是:判断一张表中,若每条记录有有一个属性值为空的属性,则删除此记录。how?......
vector的相等(2008-02-24 08:31:00)
摘要:判断两个vector是否相等,则可直接用equals方法,如下:
Vector<String> e1 = new Vector<String>();
e1.add("3");
Vector<String> e2 = new Vector<String>();
e1.add("3");
e1.add("3");
System.out.println(e1.equals(e2));
而两个Vector中的元素是否相等,则要用
decisionProperty.get(j).equals(decisionProperty.get(i))......
明天任务(2008-02-23 22:23:00)
摘要:目前能想到的如下:
1 如何将粗糙集约简后的与之前的Aprior算法结合起来
2 真实数据,尝试处理
3 数据清理,到底要做成什么样子
。。。。。......
ResultSet的结果如何判断是否为空(2008-02-23 22:20:00)
摘要:目前有三条语句需要执行并保存结果,每一条的结果不论有无都要记录下来,以便对其它相关数据进行处理。
之前最常用的这样的:
ResultSet rs = SqlFunction.getResultSet(sql);
while (rs.next()) {
decisionProperty.add(rs.getString(1));
}
但是需要注意的是,如果直接用rs.next即把结果集为空的直接跳过去了,如果rs.next的指针一开始所在位置是第一个的上一个,并且不允许为空,若为空,则直接跳过,直至下一个不为空的开始记录。
这样的话,我就不知道哪条语句的执行结果为空了
看了看ResultSet的方法,也没有找到相应的方法,上网查了下,所用的方法均不能实现,因为不论是是getRow或者是getFetchsize均要求在rs.next不为空下才有意义,这样就不能得到我想要结果了。
但是似乎还有一个方法是可取的,就是用select count(*),若为0则说明为空。但是这样的话,所花费的很大的,不仅要查询次数据库,而且相应的存储空间也要增加,十分不划算。
后来群上有人说了下,能不能用ResultSet的last或者first方法,他的解释是,若结果集不为空,则指向最后一个,若结果集为空,则返回false。嗯,看来可以试一下。我直接在rs.next外调用了下这个方法,但是却报错如下:Microsoft][SQLServer 2000 Driver for JDBC]Unsupported method: ResultSet.last。。GOOGLE了下,有人提出如下解决方法:
在createStatement时,不用其默认的方法,而是如下所示createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY),然后再调用last方法就OK了
但很奇怪的是,我必须先用rs.next把结果存下来后,再判断rs.last,rs.next的不为空的结果才能正确保存,若两个顺序掉换,则rs.next的结果集不能正确保存,均为空。因为没有debug,所以细节不......
粗糙集的属性约简(2008-02-23 22:01:00)
摘要:粗糙集的属性约简规则如下,数据如下所示:
a1 b1 c1 d1
a1 b2 c1 d2
a2 b3 c2 d3
a1 b2 c3 d3
a1 b1 c3 d3
a1 b3 c1 d3
a1 b4 c1 d1
最基本的:即,第一列属性去掉后,随后余下的属性进行查询时,相同的条件属性的决策属性没有冲突,则说明去掉第一列并没有不一致的数据产生,则说明第一列可去掉,如此循环,直到所有的决策属性都被判断完毕
说是很简单,但是实现起来细节问题很多,思路如下:
从第一个属性开始循环,直至最后一个条件属性,用余下的条件属性进行查询,分如下情况:
if(在DB中无相同的条件属性) 则说明根本不可能产生不一致数据的机会,此属性可去掉
if(有相同的条件属性)则找出相应的决策属性,判断是否相等{
if(决策属性相等) 则说明相同的条件属性并没有产生不同的决策属性,可去掉
if(决策属性不相等) 则说明相同的条件属性产生了不同的决策,不可去掉(此属性起关键作用)
}
问题:
判断一个Vector中的重复元素,并计算重复次数,并判断重复次数是否过半数以上,如下方法:
public boolean getSymbol(Vector<String> decisionProperty) {
boolean isFlag = false;
int length = decisionProperty.size();
Vector<String> distinctDecProperty = new Vector<String>();
Vector<Boolean> flag = new Vector<Boolean>();
int i = 0;......
将不一致决策表改成一致决策表(2008-02-23 00:01:00)
摘要:在数据库中,经常有这样的数据:
a1 b1 c1 d1
a1 b2 c1 d2
a2 b3 c2 d3
a1 b2 c3 d3
a1 b2 c1 d3
注意第二条和第五条数据,其中条件属性都为a1 b2 c1,但是决策属性却不相等,一个是d2一个是d3,即相同的条件属性却有不同的决策属性,即此决策表在粗糙集中称为不一致决策表,今天所做的就是把不一致决策表中的不一致数据去掉,使之成为一致决策表。
先用select property1,property2,property3 from answer_new group by property1,property2,property3 having count(*) > 1找出重复的数据的条件属性
然后用最简单的select id from answer_new where property1='a1' and property2='b2' and property3='c1'找出不一致数据的ID,并保存到idVector中
然后再交idVector中的数据只保留一个ID就好,其余的ID均delete掉,"delete from answer_new where id = " + id.get(j)
收获:
1 有些功能固然可以用编程实现,但是因与数据相关,要仔细思考能否用SQL语句来实现,这样会在编程上节省很多
2 有时把问题想复杂了并不是好事,例如存储时想用类propertyValue然后再保存到Vector中,但是最后的存储结构并不是像我想的那样。于是又折回来,直接用Vector存储
3 有时有的数据结果不一定非要存下来然后再处理,而是直接数据就数据地来处理,这样可以节省很多存储空间和编程上的麻烦。如,第二个的查询语句就是WHERE中的查询条件就是直接应用了第一个查询结果,而没有交其保存在V中
4 要注意数据什么时候该声明,什么时候该赋值,有的时候在不同的地方特别是在括号里外,结果会完全不一样
5 要多想,看有没有其它的方法到达相同的目的地,可能会很慢,但会很有收获。但是也不能想太多,呵呵
问题:
1第二个查询时的WHERE查询条件,是一个p......
iterator的简单用法(2008-02-22 22:04:00)
摘要:Iterator i1 = unconsistentNotes.iterator();
while(i1.hasNext()){
Vector<Object> o1 = (Vector<Object>) i1.next();
Iterator i2 = o1.iterator();
while(i2.hasNext()){
String unconsistentConditional = "";
PropertyValue p1 = (PropertyValue) i2.next();
unconsistentConditional += p1.property + "='" + p1.value + "' and ";
System.out.print(unconsistentConditional);
}
}......
删除数据库中重复记录的SQL语句(转) (2008-02-22 13:07:00)
摘要:
在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢?
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)
3、查找表中多余的重复记录(多个字段)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae gr......
如何删除数据表格中的重复记录(2008-02-22 12:08:00)
摘要:有思路,但是效率太差,要不断的遍历整个数据库表格,在SQL中有没有简单的方法呢,正在寻找中。。。。。。
select id from answer_new
where (property1,property2,property3) IN
(select property1,property2,property3 from answer_new
group by property1,property2,property3
having count(*) > 1) 不完全正确
其中,select property1,property2,property3 from answer_new
group by property1,property2,property3
having count(*) > 1 查询出数据库中property1,property2,property3相同的数据a1 b2 c1
但是IN的用法是不对的,会提示出现‘第 2 行: ',' 附近有语法错误’或‘当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。’的错误提示信息,原因是IN时, in 里面的查询语句应该只写一个字段
难道只能一个property一个property的去相等么?有没有简便的方法?
目前想到的方法是这个,可也太复杂了吧:
select ID from answer_new
where property1 IN
(select property1 from answer_new
group by property1,property2,property3
having count(*) > 1)
AND
(prope......
疑问:resultset中的next与get方法(2008-02-22 10:59:00)
摘要:resultset即是JDBC中执行数据库查询语句后的查询结果集合,例如保存此SQL语句select distinct property4 from answer_new的结果[d1, d2, d3],但是今天遇到了一个取出来的问题
因为我只要查询出一个property4就可以了,所以自己知道只有一列查询结果,因此就不想用rs.next方法,直接使用getString(int columnIndex) 方法(将columIndex直接赋值为1即可),但是却运行出如下错误:
Exception in thread "main" java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Invalid operation for the current cursor position.
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.validateCursorPosition(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.getString(Unknown Source)
at datamining.PropertyReduction.getDecisionProperty(PropertyReduction.java:30)
at datamining.PropertyReduction.main(PropertyReduction.java:108)
后来查了些资料,加入rs.next方法就好了,如下:
while(rs.next()){
decisionProperty.add(rs.getString(1));