对于子查询语句多条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')
相关推荐
2301_8000742117 分钟前
mysql DQL
数据库·sql·mysql
西风未眠24 分钟前
ClickHouse数据库引擎引起的数据丢失
数据库·clickhouse·故障
海浪仙人掌32 分钟前
应收账款分析如何操作?应收账款分析有哪些注意事项?
数据库·人工智能
Elastic 中国社区官方博客35 分钟前
在 Elasticsearch 中回填时间序列数据:通过批量 API 加载数月的历史指标数据
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·全文检索
Horn Still Sounds40 分钟前
Linux网络并发服务器模型与SQLite数据库学习笔记
linux·服务器·数据库
大梦想家a42 分钟前
新能源汽车共享充电桩收费管理系统的设计与实现(SpringBoot+MyBatis-Plus+Vue,前后台分离完整源码)
spring boot·汽车·mybatis
昵称画1 小时前
POC验证怎么设计用例?不走过程的实操要点
大数据·数据库·人工智能·低代码·excel
TDengine (老段)1 小时前
TDengine Catalog 与元数据缓存
大数据·数据库·物联网·缓存·时序数据库·tdengine
CarIise2 小时前
MySQL数据库表关系与多表查询:从表间关系设计到JOIN联表查询
数据库·mysql
网络工程小王2 小时前
【LLM开发实验】FastAPI 学习笔记
数据库·笔记·学习·mysql·fastapi