完整报错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')
