对于子查询语句多条sql报错排查

完整报错sql:

sql 复制代码
SELECT *
  FROM (SELECT CO_CZ_XTHF.XTBM AS MENU_ID, /**菜单ID */
               '0' AS PARENT_ID, /**父菜单ID */
               CO_CZ_XTHF.XTMC AS MENU_NAME, /**菜单名称 */
               CO_CZ_XTHF.PATH AS PATH, /**路由地址 */
               CO_CZ_XTHF.COMPONENT AS COMPONENT, /**组件路径 */
               '' AS "QUERY", /**路由参数 */
               CO_CZ_XTHF.VISIBLE AS VISIBLE, /**菜单状态(0显示 1隐藏) */
               '0' AS STATUS, /**菜单状态(0正常 1停用) */
               '' AS PERMS, /**权限标识 */
               '1' AS IS_FRAME, /**是否为外链(0是 1否) */
               0 AS IS_CACHE, /**是否缓存(0缓存 1不缓存) */
               'M' AS MENU_TYPE, /**菜单类型(M目录 C菜单 F按钮) */
               CO_CZ_XTHF.ICON AS ICON, /**菜单图标 */
               CO_CZ_XTHF.XH AS ORDER_NUM, /**显示顺序 */
               NULL AS CREATE_TIME, /**创建时间 */
               3 AS APPLICATION_ID, /**应用id */
               '' AS CKMC, /**窗口名称 */
               '' AS CKCS, /**窗口参数 */
               '' AS FRURL, /**帆软报表地址 */
               '0' AS AUTOREFRESH /**自动刷新*/,
               0 lx
          FROM CO_CZ_XTHF /*一级菜单*/
         WHERE CO_CZ_XTHF.XTLX = 0
           AND EXISTS
         (SELECT 1
                  FROM CO_QX_GNLB, CO_CZ_XTMK, CO_QX_CZYGW, CO_QX_GWGN
                 WHERE CO_QX_GNLB.MKBM = CO_CZ_XTMK.MKBM
                   AND (CO_CZ_XTMK.XTBM = CO_CZ_XTHF.XTBM)
                   AND (CO_QX_GWGN.NBBM = CO_QX_GNLB.GNNBBM)
                   AND (CO_QX_GWGN.GWBM = CO_QX_CZYGW.GWBM)
                   AND CO_QX_GNLB.GNLX = 0
                   AND CO_QX_CZYGW.CZYNBBM = '3358' /*操作员内部工号*/
                )
        UNION
        SELECT CO_CZ_XTMK.MKBM AS MENU_ID, /**菜单ID */
               CO_CZ_XTMK.XTBM AS PARENT_ID, /**父菜单ID */
               CO_CZ_XTMK.MKMC AS MENU_NAME, /**菜单名称 */
               CO_CZ_XTMK.PATH AS PATH, /**路由地址 */
               CO_CZ_XTMK.COMPONENT AS COMPONENT, /**组件路径 */
               '' AS "QUERY", /**路由参数 */
               CO_CZ_XTMK.VISIBLE AS VISIBLE, /**菜单状态(0显示 1隐藏) */
               '0' AS STATUS, /**菜单状态(0正常 1停用) */
               '' AS PERMS, /**权限标识 */
               '1' AS IS_FRAME, /**是否为外链(0是 1否) */
               0 AS IS_CACHE, /**是否缓存(0缓存 1不缓存) */
               'M' AS MENU_TYPE, /**菜单类型(M目录 C菜单 F按钮) */
               CO_CZ_XTMK.ICON AS ICON, /**菜单图标 */
               CO_CZ_XTMK.XH AS ORDER_NUM, /**显示顺序 */
               NULL AS CREATE_TIME, /**创建时间 */
               3 AS APPLICATION_ID, /**应用id */
               '' AS CKMC, /**窗口名称 */
               '' AS CKCS, /**窗口参数 */
               '' AS FRURL, /**帆软报表地址 */
               '0' AS AUTOREFRESH /**自动刷新*/,
               0 lx
          FROM CO_CZ_XTMK /*二级菜单*/
         WHERE EXISTS (SELECT 1
                  FROM CO_QX_GNLB, CO_CZ_XTHF, CO_QX_CZYGW, CO_QX_GWGN
                 WHERE CO_QX_GNLB.MKBM = CO_CZ_XTMK.MKBM
                   AND (CO_CZ_XTMK.XTBM = CO_CZ_XTHF.XTBM)
                   AND (CO_QX_GWGN.NBBM = CO_QX_GNLB.GNNBBM)
                   AND (CO_QX_GWGN.GWBM = CO_QX_CZYGW.GWBM)
                   AND CO_QX_GNLB.GNLX = 0
                   AND CO_QX_CZYGW.CZYNBBM = '3358' /*操作员内部工号*/
                )
        UNION
        SELECT TO_CHAR(CO_QX_GNLB.GNNBBM) AS MENU_ID, /**菜单ID */
               CO_QX_GNLB.MKBM AS PARENT_ID, /**父菜单ID */
               CO_QX_GNLB.GNMC AS MENU_NAME, /**菜单名称 */
               CO_QX_GNLB.PATH AS PATH, /**路由地址 */
               CO_QX_GNLB.COMPONENT AS COMPONENT, /**组件路径 */
               '' AS "QUERY", /**路由参数 */
               CO_QX_GNLB.VISIBLE AS VISIBLE, /**菜单状态(0显示 1隐藏) */
               '0' AS STATUS, /**菜单状态(0正常 1停用) */
               '' AS PERMS, /**权限标识 */
               '1' AS IS_FRAME, /**是否为外链(0是 1否) */
               0 AS IS_CACHE, /**是否缓存(0缓存 1不缓存) */
               'C' AS MENU_TYPE, /**菜单类型(M目录 C菜单 F按钮) */
               CO_QX_GNLB.ICON AS ICON, /**菜单图标 */ --        CO_QX_GNLB.GNBM AS ORDER_NUM, /**显示顺序 */    
               TO_NUMBER(REGEXP_REPLACE(CO_QX_GNLB.GNBM, '[^0-9]+', '')),
               NULL AS CREATE_TIME, /**创建时间 */
               3 AS APPLICATION_ID, /**应用id */
               CO_QX_GNLB.CKMC AS CKMC, /**窗口名称 */
               CO_QX_GNLB.CKCS AS CKCS, /**窗口参数 */
               CO_QX_GNLB.FRURL AS FRURL, /**帆软报表地址 */
               nvl(CO_QX_GNLB.AUTOREFRESH, '0'),
               (SELECT NVL(lx, 0)
                  FROM co_cygj
                 WHERE ID = CO_QX_GNLB.GNNBBM
                   AND GH =
                       (SELECT CZYDM FROM CO_QX_XTCZY WHERE CZYNBBM = '3358')) AS LX
          FROM CO_QX_GNLB /*三级菜单*/
         WHERE CO_QX_GNLB.GNLX = 0
           AND EXISTS
         (SELECT 1
                  FROM CO_CZ_XTHF, CO_CZ_XTMK, CO_QX_CZYGW, CO_QX_GWGN
                 WHERE CO_QX_GNLB.MKBM = CO_CZ_XTMK.MKBM
                   AND (CO_CZ_XTMK.XTBM = CO_CZ_XTHF.XTBM)
                   AND (CO_QX_GWGN.NBBM = CO_QX_GNLB.GNNBBM)
                   AND (CO_QX_GWGN.GWBM = CO_QX_CZYGW.GWBM)
                   AND CO_QX_GNLB.GNLX = 0
                   AND CO_QX_CZYGW.CZYNBBM = '3358' /*操作员内部工号*/
                )) A
 ORDER BY PARENT_ID

报错原因:在上面的sql中下面的子查询列,返回了多条记录,因为查询的是列,只能返回一条数据展示这条列,这里不是查的行,对于列的子查询只能返回一条记录

sql 复制代码
 (SELECT NVL(lx, 0)
                  FROM co_cygj
                 WHERE ID = CO_QX_GNLB.GNNBBM
                   AND GH =
                       (SELECT CZYDM FROM CO_QX_XTCZY WHERE CZYNBBM = '3358')) AS LX

排查多条记录的语句:

sql 复制代码
SELECT *
FROM co_cygj
-- 通过主表的字段关联子表
WHERE (ID, GH) 
-- 相当于在子表里面查询多余数据,这个子表是按照自己的方式条件去排查 对应数据有多条的记录
IN (
    SELECT ID, GH
    FROM co_cygj
    -- 这里用子表 id 字段去关联另一张表CO_QX_GNLB的GNNBBM id  和GNNBBM 字段类型 和数据都是一致的,这里用in是为了查出多条的记录
    WHERE ID IN (SELECT GNNBBM FROM CO_QX_GNLB WHERE GNLX = 0)
    -- 这个是GH 在co_cygj表中是用的 3358对应的 用户名(SYS),所以要根据CZYNBBM员工内部编码 关联查询一下对应的用户名
      AND GH = (SELECT MAX(CZYDM) FROM CO_QX_XTCZY WHERE CZYNBBM = '3358' )
    GROUP BY ID, GH
    -- 统计数量大于1的记录
    HAVING COUNT(*) > 1
)
ORDER BY ID, GH for update ;

解决办法:

sql 复制代码
SELECT NVL(lx, 0)
                  FROM co_cygj
                 WHERE ID = CO_QX_GNLB.GNNBBM
                /** 加上机构id,去除多机构导致的多条数据  **/
                 and JGDM = '66'
                   AND GH =
                       (SELECT CZYDM FROM CO_QX_XTCZY WHERE CZYNBBM = '3358')
相关推荐
柒.梧.6 小时前
MySQL核心考点:存储引擎区别+视图详解
数据库·mysql·面试
电商API&Tina6 小时前
跨境电商如何接入1688官方寻源通接口?附接入流程
java·数据库·python·sql·oracle·json·php
明月_清风6 小时前
🚀 Flyway 存量数据库迁移:50张表一键导出清洗实战(附完整脚本)
数据库·后端
羊小蜜.6 小时前
Mysql 08: 数据表基本操作——从创建到约束
数据库·mysql·数据表
程序员小郭836 小时前
MySQL分库分表策略全解析(实战版)
数据库·mysql·架构
卓怡学长6 小时前
m320基于Java的网络音乐系统的设计与实现
java·数据库·spring·tomcat·maven
爱浦路 IPLOOK7 小时前
选对UPF网元供应商,解锁5G-A时代行业赋能新可能
运维·网络·数据库
Elastic 中国社区官方博客7 小时前
将 Logstash 管道从 Azure Event Hubs 迁移到 Kafka 输入插件
大数据·数据库·elasticsearch·microsoft·搜索引擎·kafka·azure
草莓熊Lotso7 小时前
MySQL 事务管理全解:从 ACID 特性、隔离级别到 MVCC 底层原理
linux·运维·服务器·c语言·数据库·c++·mysql
鸽芷咕7 小时前
Oracle 替代工程实践深度解析:金仓全链路工程实践 —— 从评估决策到平滑上线的深度技术攻坚
数据库·oracle