我正在优化很久以前由我从未见过的开发人员编写的代码。我遇到了一个需要修改的方法。首先想到的是使用存储过程。也许有更好的方法来实现这个问题。 代码就是这样:
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));
}
}
除了使用存储过程之外,还有一种更好的方法可以避免在此方法中不必要地访问数据库。
答案 0 :(得分:1)
尝试此查询,检查它是否为您提供相同的结果。有了这个,你应该在一个查询中直接得到你想要的所有值
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不为null(和另一个中的vw1.c),也许就足够了:
CASE WHEN (vw1.f IS NOT NULL) AND (vw1.d = tb1.b) AND (vw1.f=tb1.a) THEN 1 ELSE 0 END
答案 1 :(得分:0)
您可以在初始选择的同时执行计数,从而无需为rs
中的每一行再运行两个查询:
SELECT t.a, t.b, t.e, t1.RowCount1, t2.RowCount2
FROM table1 AS t
LEFT JOIN
( SELECT c, d, COUNT(*) AS RowCount1
FROM vw_view1
GROUP BY c, d
) AS t2
ON t2.c = t.a
AND t2.d = t.b
LEFT JOIN
( SELECT c, e, COUNT(*) AS RowCount2
FROM vw_view1
GROUP BY c, e
) AS t3
ON t3.c = t.a
AND t3.e = t.e;
初始选择会更慢,但后续循环会更有效。