如何在java中对另一个选择查询的结果集执行选择查询

Posted

技术标签:

【中文标题】如何在java中对另一个选择查询的结果集执行选择查询【英文标题】:How to perform a select query on the ResultSet of another select query in java 【发布时间】:2020-06-17 11:36:26 【问题描述】:

这是我尝试在第一个冗长查询的resultSet 上执行第二个查询的代码。我需要上传这个 某处的数据。

这样做对吗?

或者除了再次查询数据库之外还有更好的方法吗?

 public String createQuery() throws SQLException 
     StringBuilder Query = new StringBuilder();
     try 
        Query.append(" SELECT ...... ")
        catch (Exception e) 
        e.printStackTrace();
    
    return Query.toString();

 private void openPreparedStatements() throws SQLException 
    myQuery = createQuery();      
    try 
        QueryStatement = dbConnection.prepareStatement(myQuery);
     catch (SQLException e) 
        e.printStackTrace();
        return;
    

public ResultSet selectData(String timestamp) throws SQLException 
    openConnection();
    ResultSet result = null;
    ResultSet rs_new=null;
    try 
        result = QueryStatement.executeQuery();
        while (result.next()) 
           String query = "SELECT * FROM " + result + " WHERE " + "ID" + " =" + "ABC";
            rs_new =QueryStatementNew.executeQuery(query);
            System.out.print(rs_new);
        
     catch (SQLException e) 
        LOGGER.info("Exception", e);
    

    return result;

【问题讨论】:

您需要将此代码与结果集代码嵌套。 我读到这种方法根本不适合,你知道为什么吗? 请分享详细的代码 sn-ps 以清楚了解您的实现。 更新了完整代码 【参考方案1】:

您可以将它们组合起来,而不是运行两个单独的查询(当您不需要中间查询时)。

例如你可以这样做:

SELECT *
FROM (
  -- first query here
) x
WHERE ID = 'ABC'

【讨论】:

我需要两个不同的结果集,因为我需要将第一个发送到 FTP,第二个发送到弹性 那么答案是否定的。您要求实现一个结果集,然后使用它来运行第二个查询。 DB2(和大多数数据库)不是这样工作的 如果为了提高效率而运行复合查询(像这样),引擎不会实现第一个查询,而是将其流水线。您需要分别运行这两个查询。 我们有什么理由不能这样做吗?有什么文件吗?请告诉我【参考方案2】:

您不能在一个数据库连接中使用两个语句对象。因此,您可以打开另一个数据库连接并在第二个连接中执行第二个语句,或者遍历第一个语句的结果集并存储您需要的值(例如在数组/集合中)然后关闭该语句并运行第二个,这次从您保存它们的数组/集合中检索值。请参阅Java generating query from resultSet and executing the new query

【讨论】:

【参考方案3】:

让 Db2 将中间结果集保存在全局临时表中,如果您有能力使用它,并且您的应用程序使用相同的数据库连接会话。

DECLARE GLOBAL TEMPORARY TABLE SESSION.TMP_RES AS 
(
SELECT ID, ... -- Your first lengthy query text goes here
) WITH DATA WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED;

您可以将后续SELECT ... FROM SESSION.TMP_RES的结果发送到FTP,将SELECT * FROM SESSION.TMP_RES WHERE ID = 'ABC'的结果发送到elastic。

【讨论】:

以上是关于如何在java中对另一个选择查询的结果集执行选择查询的主要内容,如果未能解决你的问题,请参考以下文章

对另一个查询的结果执行查询?

(java)如何将从数据库中查询出来的结果集转换为对应类的对象?可考虑hibernate。

如何将 mybatis 选择查询的巨大结果集导出到 csv?

java在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException

如何使用相同的语句和结果集运行多个选择查询? [复制]

如何在 django 中过滤对另一个结果的查询?