如何从子查询中获取 ResultSet 的别名?

Posted

技术标签:

【中文标题】如何从子查询中获取 ResultSet 的别名?【英文标题】:How can I get the alias name for my ResultSet from a Subquery? 【发布时间】:2015-02-20 08:12:29 【问题描述】:

我在获取 ResultSet 的列名别名时遇到问题。 我做了一个子查询,我在其中使用别名函数(SQL 中的 MAX(...)),但每次执行语句时,我都会得到 java.sql.SQLException,因为列名无效。我使用当前别名调用 getString - 我的 ResultSet 的函数。

这是我在 Eclipse 中的 SQL 语句:

String sql = "SELECT   a.steelgrade, a.prod_order_id, a.prod_order_item_pos, "
                        +"a.prod_order_version, a.strip_thickn_aim, a.strip_width_aim, "
                        +"a.customer, a.order_weight_plan, b.grund_kommlos, b.coil_weight "
                        +"FROM (SELECT   prod_order_id, prod_order_item_pos, "
                          + "MAX (prod_order_version) AS max_version "
                     + "FROM production_order "

在结果集中while.next()-Loop:

prod_order_version = AuftraegeProduction.getString("max_version");

这是整个 SQL 语句(在数据库中它工作正常!):

SELECT   a.steelgrade, a.prod_order_id, a.prod_order_item_pos,
     a.prod_order_version, a.strip_thickn_aim, a.strip_width_aim,
     a.customer, a.order_weight_plan, b.grund_kommlos, b.coil_weight
FROM (SELECT   prod_order_id, prod_order_item_pos,
               MAX (prod_order_version) AS max_version
          FROM production_order
GROUP BY prod_order_id, prod_order_item_pos) c
     JOIN
     production_order a
     ON a.prod_order_id = c.prod_order_id
   AND a.prod_order_item_pos = c.prod_order_item_pos
   AND a.prod_order_version = c.max_version
     JOIN pps_plan_slab b
     ON b.prod_order_id = c.prod_order_id
   AND b.prod_order_item_pos = c.prod_order_item_pos
   AND b.prod_order_version = c.max_version
WHERE a.strip_thickn_aim > 1.78
 AND a.strip_thickn_aim < 3.26
 AND a.steelgrade = 'M4R51'
 AND a.prod_order_id NOT BETWEEN '0999551' AND '0999599'
 AND a.strip_width_aim BETWEEN 1126 AND 1166
 AND NVL (a.order_weight_plan, 0) > 0
 AND a.order_weight_plan >= b.coil_weight
ORDER BY prod_order_id ASC

有人有什么建议吗?

莫里斯

【问题讨论】:

您是否尝试直接在数据库中手动运行查询?似乎它缺少了一些东西......也许group by?顺便说一句,如果您标记您正在使用的数据库,将不胜感激...... 是的,我之前在数据库中执行了语句,以检查我的 SQL 查询是否一切正常。在数据库中,它可以工作!在这种情况下,我使用 Oracle 数据库。 首先,您缺少一个右括号 - 所以它不可能“按原样”运行。二、不分组真的能跑:SELECT prod_order_id, prod_order_item_pos, MAX (prod_order_version) AS max_version FROM production_order吗?可能我太久没接触Oracle DB了…… 我创建了一个“GROUP BY”,但还是不行:“...GROUP BY prod_order_id, prod_order_item_pos) c 正如我在最初的评论中所写的:首先让查询在数据库上运行,然后开始担心让它与您的代码一起工作! 【参考方案1】:

当使用聚合函数 max(),min(),sum(),... 时,必须使用 group by 子句。

【讨论】:

好的,到目前为止,我已经编辑了 SQL 语句:'code' String sql2 = "SELECT a.steelgrade, a.prod_order_id, a.prod_order_item_pos, " +"a.prod_order_version, a. strip_thickn_aim, a.strip_width_aim, " +"a.customer, a.order_weight_plan, b.grund_kommlos, b.coil_weight " +"FROM (SELECT prod_order_id, prod_order_item_pos, " + "MAX (prod_order_version) AS max_version " + "FROM production_order " + "GROUP BY prod_order_id, prod_order_item_pos) c " 这也会引发错误,因为子查询中不允许分组。向我们提供要求和表结构,以帮助您重新构建查询结构。 我刚刚编辑了我的问题,在那里你可以看到适用于 oracle DB 的整个 sql 语句

以上是关于如何从子查询中获取 ResultSet 的别名?的主要内容,如果未能解决你的问题,请参考以下文章

如何从子查询中获取结果作为查询中的参数

JDBC ResultSet 获取具有表别名的列

如何从子表单中获取父 Symfony3 表单的值?

如何根据查询从子文档数组中更新子文档字段?

如何从子查询中返回两个字段

如何使用 jQuery 从子元素中获取数据以在 xml api 中查找其他子元素?