避免循环执行数据库查询

时间:2019-03-21 07:53:47

标签: java sql

我有一张桌子,

process_name |  startTime             | endTime               | parent_id
-------------------------------------------------------------------------
chrome       |  2019-03-06 00:48:27   | 2019-03-06 00:48:58   | 111
chrome       |  2019-03-07 00:48:27   | 2019-03-07 00:48:58   | 112
firefox      |  2019-03-08 00:48:27   | 2019-03-08 00:48:58   | 113
IE           |  2019-03-09 00:48:27   | 2019-03-09 00:48:58   | 114
firefox      |  2019-03-10 00:48:27   | 2019-03-10 00:48:58   | 115
chrome       |  2019-03-11 00:48:27   | 2019-03-11 00:48:58   | 116

表格中的一些点

  1. 相同的process_name可以在不同的parent_ids下找到。

  2. 我已经知道process_name并在其中存在ArrayList的{​​{1}}。

对于给定的parent_ids,我需要找到process_name中存在的所有startTime的{​​{1}}和endTime

我能想到的就是使用parent_ids循环并执行以下查询。

ArrayList

我可以避免循环执行此查询并采用其他更好的方法吗?

此刻我使用for,但是数据库可能会更改为select startTime, endTime from myTable where parent_id = ? and process_name=?

4 个答案:

答案 0 :(得分:2)

有多种方法可以解决此问题:

  1. 根据建议,由于您已经拥有process_name,因此可以获得该进程名称的所有开始和结束时间。

  2. 另一种方法是首先准备一个parent_id的字符串,然后使用一个查询将其查询到数据库:

代码:

String s = "(";
for(int i = 0; i < list.length; i++)
{
    if(i<list.length-1) s+=list[i] + ",";
    else s+= ""+ list[i] + ")";
}

String query = " select startTime, endTime from myTable where parent_id IN " + s + " and process_name=?";

答案 1 :(得分:0)

在循环中执行查询不是一个好习惯。相反,为什么不立即获取属于给定进程的所有记录。也许将GROUPBY子句用于process_name以及其他列上的聚合函数[如果您需要在其他列上执行任何操作并避免自己通过代码执行操作] 掌握了所有记录后,即可将startTime和endTime用于进一步处理。

希望有帮助。

答案 2 :(得分:0)

不可能只是做:

select parent_id, startTime, endTime from myTable where process_name=?

并获取所有parent_id值的值,然后再过滤ArrayList上的值?

答案 3 :(得分:0)

作为@ prakhar-londhe解决方案的细微变化,您也可以像在{p1

in

,然后为每个String query = " select startTime, endTime from myTable where parent_id IN (?, ?, ?) and process_name = ?"; 添加一个参数。当然,您仍然必须组装parent_id(将query括在括号内的?)和参数列表中。