java - 使用存储过程优化查询

标签 java mysql sql

我正在优化由一位我从未见过的开发人员很久以前编写的代码。我遇到了一个需要修改的方法。首先想到的是使用存储过程。也许有更好的方法来实现这一点,因此这个问题。 代码是这样的:

public void execute()
{
    String query = "select a, b, e from table1";
    ....
    ResultSet rs = stmt.executeQuery(query);
    String query2 = null;
    List<Integer> list1 = ....
    List<Integer> list2 = ....
    while(rs.next)
    {
        query2 = "select count(*) as rowcount from vw_view1 where f='" + rs.getString("a") + "' and d='" + rs.getString("b") + "'";
       .....
       ResultSet rs2 = stmt2.executeQuery(query2);
       list1.add(rs2.getInt(rowcount));

        query3 = "select count(*) as rowcount from vw_view1 where c='" + rs.getString("a") + "' and e='" + rs.getString("e") + "'";
       .....
       ResultSet rs3 = stmt3.executeQuery(query3);
       list2.add(rs3.getInt(rowcount));
    }
}

除了使用存储过程之外,是否有更好的方法可以避免此方法中不必要的数据库访问。

最佳答案

尝试这个查询,检查它是否给出相同的结果。有了这个,您应该可以在一个查询中直接获得您想要的所有值

SELECT c, 
SUM(CASE WHEN vw1.d = tb1.b THEN 1 ELSE 0  END) as rowcountListOne,
SUM(CASE WHEN vw1.e = tb1.e THEN 1 ELSE 0  END) as rowcountListTwo
from vw_view1 vw1
left join table1 tb1 on vw1.c=tb1.a
GROUP BY c

在您发布的新案例中,您实际上应该通过 c 和 f 加入:

SELECT c, f,
SUM(CASE WHEN (vw1.d = tb1.b) AND (vw1.f=tb1.a) THEN 1 ELSE 0  END) as rowcountListOne,
SUM(CASE WHEN (vw1.e = tb1.e) AND (vw1.c=tb1.a) THEN 1 ELSE 0  END) as rowcountListTwo
FROM vw_view1 vw1
LEFT JOIN table1 tb1 on (vw1.c=tb1.a OR vw1.f=tb1.a)
GROUP BY c, f

您还应该检查 Lennart 关于 COUNT 的说法,我想我应该在这些情况下添加一些 NULL 管理,但我现在无法测试它。

如果您在这种情况下检查 vw1.f 不为空(在另一种情况下检查 vw1.c),也许就足够了:

CASE WHEN (vw1.f IS NOT NULL) AND (vw1.d = tb1.b) AND (vw1.f=tb1.a) THEN 1 ELSE 0  END

关于java - 使用存储过程优化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25283215/

相关文章:

java - Java 中的 SQL。选择密码(md5)问题。 rs 不执行查询,抛出异常

java - 如何清除JSP程序中的数据库连接错误?

MySQL 在插入时在另一列中使用 "Auto Number Field Value"

mysql - 涉及计数的非常基本的 SQL 查询

mysql - 带有连接表的 SQL Sum 子查询?

php - 如何获取具有受影响行数的列的总和

java - 为什么我们在weka评估函数中使用训练数据?

java - 如何删除按钮上的 "selected"边框?

java - 半唯一嵌套 Java 映射?

mySQL 触发器 : Setting empty to NULL, 在最后一列上不起作用