数据库版本题目导致的查询bug

打印 上一主题 下一主题

主题 1019|帖子 1019|积分 3057

一个比力有意思的数据库查询bug,SQL如下:
  1. SELECT agvo1.org_id org_ids, ptd.deadline,
  2.     t.*
  3.      , (SELECT JSON_ARRAYAGG(
  4.                        JSON_OBJECT(
  5.                                'annualGoalValueId', atv.id,
  6.                                'goalValue', atv.goal_value,
  7.                                'orderNo', atv.order_no,
  8.                                'attachments', atv.attachments,
  9.                                'orgs', (SELECT JSON_ARRAYAGG(
  10.                                                        JSON_OBJECT(
  11.                                                                'orgId', org.id,
  12.                                                                'orgName', org.name
  13.                                                        )
  14.                                                )
  15.                                           FROM org
  16.                                                    INNER JOIN annual_goal_value_org atvo2 ON org.id = atvo2.org_id
  17.                                               AND atvo2.org_id = agvo1.org_id -- *这里报错!
  18.                                          WHERE atvo2.annual_goal_value_id = atv.id)
  19.                        )
  20.                )
  21.           FROM annual_goal_value atv
  22.          WHERE atv.target_id = t.id
  23.          ORDER BY order_no) AS annual_goal_values_json
  24.      , pto.name office_name
  25.      , ts.scope_name scope_name
  26.   FROM annual_goal_value_org agvo1
  27.            LEFT JOIN annual_goal_value agv ON agvo1.annual_goal_value_id = agv.id
  28.            JOIN target t ON agv.target_id = t.id AND t.deleted_at IS NULL
  29.       AND t.status = 1 AND t.submit_type = 1
  30.            LEFT JOIN user u ON t.created_by = u.id
  31.            LEFT JOIN target_scope ts ON t.target_scope_id = ts.id
  32.            LEFT JOIN pt_office pto ON t.office_id = pto.id
  33.            JOIN pt_task_deadline ptd ON ptd.org_id = agvo1.org_id AND ptd.pt_task_id = (SELECT id
  34.                                                                                           FROM pt_task
  35.                                                                                          WHERE FIND_IN_SET(agvo1.org_id, org_ids))
  36. WHERE t.year = ?
  37. ORDER BY t.created_at DESC;
复制代码
标注的地方报错,> 1054 - Unknown column 'agvo1.org_id' in 'on clause' ,我觉得难道是这里不能用外查询?就是子查询借用主查询中遍历的字段值。然后测试站没有报错,很奇怪,一样的SQL,一个报错一个不报错,唯一的变量就是MySQL的版本了,测试站是8.0.28,正式站是8.0.16,应该是版本题目。但是有个题目困扰着我,就是外查询这么通用的功能,怎么可能在这么小的版本里面进行更新修复或者开辟出来,而且当我把这行注释掉,正式站又可以跑的通,但是我这个SQL又不止这个地方用到了外查询这个特性。太奇怪了。背面思考了一下,可能不是外查询的题目,我把过滤条件放在where语句就能跑的通,我很高兴,原来是外查询放在join中是跑不通的。本来想就此竣事,但是打这篇纪录的时间发现,在背面的地方在join中也用到了外查询过滤,没有报错。所以题目到底是啥呢。
后续改成这个了:
  1. SELECT agvo1.org_id org_ids, ptd.deadline, t.*
  2.      , (SELECT JSON_ARRAYAGG(
  3.                        JSON_OBJECT(
  4.                                'annualGoalValueId', atv.id,
  5.                                'goalValue', atv.goal_value,
  6.                                'orderNo', atv.order_no,
  7.                                'attachments', atv.attachments
  8.                                 ,'orgs', (SELECT JSON_ARRAYAGG(
  9.                                                        JSON_OBJECT(
  10.                                                                'orgId', org.id,
  11.                                                                'orgName', org.name
  12.                                                        )
  13.                                                )
  14.                                           FROM org
  15.                                                    left JOIN annual_goal_value_org atvo2 ON org.id = atvo2.org_id
  16.                                          WHERE atvo2.annual_goal_value_id = atv.id
  17.                                            AND atvo2.org_id = agvo1.org_id -- 放入到where过滤
  18.                                          )
  19.                        )
  20.                )
  21.           FROM annual_goal_value atv join shmec.annual_goal_value_org agvo3 ON atv.id = agvo3.annual_goal_value_id
  22.          WHERE atv.target_id = t.id
  23.          AND agvo3.org_id = agvo1.org_id  -- 根据业务,增加了一个过滤
  24.          ORDER BY order_no) AS annual_goal_values_json -- 某高校在某任务下被分配的年度目标值
  25.      , pto.name office_name
  26.      , ts.scope_name scope_name
  27.   FROM annual_goal_value_org agvo1
  28.            LEFT JOIN annual_goal_value agv ON agvo1.annual_goal_value_id = agv.id
  29.            JOIN target t ON agv.target_id = t.id AND t.deleted_at IS NULL
  30.       AND t.status = 1 AND t.submit_type = 1
  31.            LEFT JOIN user u ON t.created_by = u.id
  32.            LEFT JOIN target_scope ts ON t.target_scope_id = ts.id
  33.            LEFT JOIN pt_office pto ON t.office_id = pto.id
  34.            JOIN pt_task_deadline ptd ON ptd.org_id = agvo1.org_id AND ptd.pt_task_id = (SELECT id
  35.                                                                                           FROM pt_task
  36.                                                                                          WHERE FIND_IN_SET(agvo1.org_id, org_ids))
  37. WHERE t.year = 2024
  38. ORDER BY t.created_at DESC;
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表