对于子查询语句多条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')
相关推荐
gp3210262 小时前
开放自己本机的mysql允许别人连接
数据库·mysql·adb
高铭杰2 小时前
Postgresql源码(155)Redo系列CLOG Redo (RM_CLOG_ID = 3)
数据库·postgresql·redo·clog
原来是猿2 小时前
MySQL【表的约束下】
数据库·mysql
6+h2 小时前
【MySQL】索引原理详解
数据库·mysql
不羁的fang少年2 小时前
2pc和3pc的比较
数据库
小尔¥2 小时前
LNMP环境部署
运维·数据库·nginx·php
深念Y2 小时前
记一次完整的MongoDB环境配置实录
数据库·mongodb
DBA小马哥2 小时前
国产数据库选型实战:MySQL迁移的兼容性、安全与性能落地
数据库·mysql·安全
Lethehong2 小时前
深入浅出:复杂查询中基于代价的连接条件下推优化实战
数据库