jdbc - 一个查询中的多个select语句

时间:2017-01-06 12:35:28

标签: java mysql jdbc

首先,我想说这个问题不是关于JOIN或UNION。 此外,我已经尝试过堆栈溢出的一些答案,但我仍然遇到问题。 (例如:Multiple queries executed in java in single statement

问题:
我想从两个表中检索数据,我不能使用JOIN或UNION,因为它们包含不同类型的数据,并且我在每个表的不同行数之后。我想要一次性完成的原因是效率,但是如果有人能说服我两个电话而不是一个电话几乎没有开销差异那么我会很高兴地解决我的问题(虽然它仍然会很高兴知道如何只使用一个查询)

代码:
基于this,我编写了以下代码(摘录):

String sql = "SET @organizationId = 0;" +
                "SELECT @organizationId := Id 'Id', Name FROM Organization WHERE Id = ?;" +
                "SELECT AssociatedOrganizationId FROM OrganizationAssociations WHERE OrganizationId = @organizationId;";

        Connection conn = null;

        try {
            conn = dataSource.getConnection();

            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, organizationId);

            boolean isResultSet = cs.execute();

            if (!isResultSet) {
                logger.error("getOrganization - retrieved result is not a ResultSet");
            }

            OrganizationDto organization = null;

            ResultSet rs = cs.getResultSet();
            if (rs.next()) {
                // create organization object using retrieved data
            }

            rs.close();

导致问题的行为:

cs.execute()总是返回false。

我尝试解决问题的观察和行动:
如所述here和Java文档中所述, CallableStatement 旨在用于调用存储过程。存储过程本身永远不会返回值,这只能通过OUT参数来实现。 考虑到这一点, .execute()返回false并不让我感到惊讶。 然而,我已将 CallableStatement 更改为 PreparedStatement Statement ,但在结果方面没有太大变化( cs。 getResultSet()仍返回null)

我寻求的答案:
 1.我想知道如何使用jdbc中具有多个SELECT语句的一个查询从多个表中检索数据。这是在没有JOINS,UNIONS等的情况下实现的。我希望能够使用我已经拥有的查询(查询工作完全正常 - 在HeidiSQL中测试)。  
2。 (可选)如果有人认为两个查询在数据库负载和性能方面没有太大差别,那么我想确信实际情况就是这样。

更新#1:
为了澄清,这是我的查询返回的数据:

ResultSet#1:
ID,姓名
1," org1_name"

结果集#2:
AssociatedOrganizationId
2
3个

1 个答案:

答案 0 :(得分:-1)

首先,您可以使用连接将您的两个查询编写为单个查询:

SELECT AssociatedOrganizationId
FROM OrganizationAssociations oi JOIN
     Organization o
     ON oa.OrganizationId = o.id
WHERE o.id = ?

其次,甚至不需要这样做,因为你可以将整个过程简化为:

SELECT AssociatedOrganizationId
FROM OrganizationAssociations oi
WHERE oa.OrganizationId = ?

我建议您花一些时间学习SQL并了解数据库的工作原理。它可能会帮助您解决您想要解决的问题。