sql 语句多层嵌套查询 使用别名 字段无效,如何解决(有图)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 语句多层嵌套查询 使用别名 字段无效,如何解决(有图)相关的知识,希望对你有一定的参考价值。

SELECT
tma.id as tid,
tma.match_id AS matchId,
tma.`status`,
(SELECT round(avg(s.sumScore),1) FROM (
SELECT
SUM(tri.score) AS sumScore
FROM
`triz_score_info` tri LEFT JOIN triz_review_submit_info trs ON trs.reviewer_id = tri.reviewer_id
WHERE
tri.apply_id = tma.id
GROUP BY
tri.reviewer_id)AS s
) AS avgScore,
tma.pro_name AS proName,
tma.create_time createTime
FROM
triz_match_applyinfo tma
WHERE
tma.match_id = 22

(SELECT round(avg(s.sumScore),1) FROM (
SELECT
SUM(tri.score) AS sumScore
FROM
`triz_score_info` tri LEFT JOIN triz_review_submit_info trs ON trs.reviewer_id = tri.reviewer_id
WHERE
tri.apply_id = tma.id
GROUP BY
tri.reviewer_id)AS s
改为
select round(avg(s.sumScore),1) from ( SELECT
SUM(tri.score) AS sumScore,tri.apply_id
FROM
`triz_score_info` tri LEFT JOIN triz_review_submit_info trs ON trs.reviewer_id = tri.reviewer_id group by tri.reviewer_id,tri.apply_id) aa where aa.apply_id=tma.id
这样应该可以。另外我多句嘴,avg那块我没看懂你怎么平均(一般都是分组直接用啊),或者说是按照什么平均。内层sql求出一个总数,外层直接计算一个平均值,这个平均值是什么?我不知道你的业务结构仅仅是臆测,反正我没看懂(直接照抄了)。追问

每个作品(aa.apply_id)有多个老师评分(tri.reviewer_id),每次打分有多个打分项(tri.score),SUM(tri.score)就是当前作品该老师打的总分
我需要查的是所有作品的得分情况(多个老师打的平均分)

追答

根据你的解释,我觉得我的写法上应该能满足要求。第一步求的是每个作品的而每个老师给的一个总分,第二步是每个作品的平均分。应该没什么问题。
不过你的trs表是干什么用的,这里是左连接,而且后面好像也没有用到,不写是不是也可以。

追问

trs表是确认老师有没有提交打分信息(只查询提交过的分数信息)

昨天试了,你的sql能实现呢,非常感谢!

参考技术A 语法错误,外面的表别名,里面的表关联怎么能用呢?追问

那遇到这种情况怎么解决啊

追答

看看sql方面得书,多写写sql就行了

参考技术B 你好!
你把这个SQL发出来啊!
我给你改一下就好啦!
完后希望你采纳!追问

发出来了,麻烦你看一下

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

【中文标题】如何从子查询中获取 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 语句

以上是关于sql 语句多层嵌套查询 使用别名 字段无效,如何解决(有图)的主要内容,如果未能解决你的问题,请参考以下文章

高级查询

sql如何根据一个字段的多个值查询

oracle如何查询嵌套表的分项

MySQL数据库高阶语句之查询视图NULL值

oracle嵌套where查询

mybatis框架中parameterType为Map的用法 和 数据库语句多层嵌套