使用选择查询问题

时间:2013-02-06 09:27:11

标签: mysql sql oracle

我正在使用select查询按名称从表中选择特定记录。该表包含超过25000条记录。

表格格式为

|rcode|rname|vcode|vname|div_sec|ofrn|phone|dat|

此外,它可能包含多个具有相同名称的记录。我正在使用以下查询

ResultSet rs=stmt.executeQuery("select * from newfarmer where rname='"+get+"'");
if(rs.next())
{
     rcode=rs.getString("rcode");
     out.print(rcode);
     out.print(" ");
}

我必须找出给定rname的rcode。现在使用上述查询的问题是,如果我搜索名为“kannan”的记录,该表包含6条名为“kannan”的记录为

10001 kannan
10089 kannan
11826 kannan
12241 kannan
12389 kannan
19926 kannan

现在,我的查询只获取了第一条记录并将结果显示为 rcode =“10001”

如果我使用

while(rs.next())
{
     rcode=rs.getString("rcode");
     out.print(rcode);
     out.print(" ");
}

它只打印最后一条记录 rcode =“19926”。假设我想用rcode 12241获取“kannan”的记录,我该如何修改查询来获取记录?请注意,我必须仅使用rname来获取详细信息。

这个问题有解决办法吗?请有人帮帮我

2 个答案:

答案 0 :(得分:2)

实际上,第二个代码段应该输出所有kannan条记录,除非您错误地转录了它。 将输出最后一个:

while(rs.next()) {
    rcode=rs.getString("rcode");
}
out.print(rcode);
out.print(" ");

理想的解决方案是根据以下两列将查询更改为限制:

select * from newfarmer where rname = 'kannan' and rcode = '12241'

但是,既然你认为这是一种可能性,那么你必须全部解决这些问题并过滤掉你想要的那些(但是与让DBMS这样做相比效率低)。换句话说,比如:

while(rs.next()) {
    rcode=rs.getString("rcode");
    if (rcode == "12241") {       // or some other identifying condition.
        out.print(rcode);
        out.print(" ");
    }
}

我的建议是返回并重新检查您是否只需使用rname来获取记录。这似乎是一个奇怪的限制,并使任何解决方案都不如其他方式那么优化。

答案 1 :(得分:1)

第二个剪切肯定会检索ResultSet中的所有行,但请注意,除非您在SQL中提供order by子句,否则不会保证记录的顺序。也许这就是为什么你认为它只是最后一个 - 你只看到返回的第一行,发现它是你期望的最后一个,而忽略了其余的。只是一种可能性。

rname列上是否有索引?如果没有,查询将会很慢。

另外,这个:

ResultSet rs=stmt.executeQuery("select * from newfarmer where rname='"+get+"'");

是对SQL注入攻击的一个大而开放的邀请。 Insead在准备好的声明中使用参数:

//Just prepare the statement once for multiple uses:
Statement stmt = conn.prepareStatement("select * from newfarmer where rname=?");

//use it:
stmt.setString(1, name);
ResultSet rs = stmt.execute(); 
// etc...