PL SQL超过单行返回问题

时间:2015-12-30 10:32:47

标签: oracle plsql ora-01427

我正在执行以下查询,我得到" ORA-01427:单行子查询返回多行"。 错误在DECODE中返回,该DECODE位于主SELECT中。 我无法将 USER_PRF_NOTIFICATION_T 表放在FROM部分中,因为 USER_PRF_NOTIFICATION_T 可能不包含任何值。如果不是 SEC_USER_PRIV.ENTITY_ID 中的值不存在于 USER_PRF_NOTIFICATION_T.ENTITY_ID 中。

    SELECT DISTINCT
    SEC_USER.USR_ID         AS USR_ID,
    SEC_USER.USR_FIRST_NAME AS USR_FIRST_NAME,
    SEC_USER.USR_LAST_NAME  AS USR_LAST_NAME,
    SEC_USER_PRIV.ROLE_ID   AS SYSTEM_ROLE_ID,
    DECODE (
              (
              SELECT
                  SYSTMTYP_CODE
              FROM
                  USER_PRF_NOTIFICATION_T
              WHERE
                  USER_PRF_NOTIFICATION_T.USR_ID = SEC_USER.USR_ID
              AND USER_PRF_NOTIFICATION_T.ENTITY_ID IN
                  (
                      SELECT
                          SERVER_T.SRV_ID
                      FROM
                          SERVER_T
                      WHERE
                          UPPER(SERVER_T.SRV_NAME) LIKE UPPER('%gen%') )
              AND USER_PRF_NOTIFICATION_T.ENTITY_TYP_CODE = 21), 1, 'SYSTEM', 2, 'TEST', NULL ,
            'ALL') AS ENTITY_SYSTM_TYP_NOTIFICATION
FROM
    SEC_USER_PRIV,
    SEC_USER
WHERE
    SEC_USER.USR_ID = SEC_USER_PRIV.USR_ID
AND ((
            SEC_USER_PRIV.ENTITY_TYP_CODE = 21
        AND SEC_USER_PRIV.ENTITY_ID IN (
            (
                SELECT
                    SERVER_T.SRV_ID
                FROM
                    SERVER_T
                WHERE
                    UPPER(SERVER_T.SRV_NAME) LIKE UPPER('%gen%') ))))

怎么能解决这个问题?直接引用实体ID显然可以解决该问题。 我尝试使用 tableof ,其中包含所有ID并尝试:

USER_PRF_NOTIFICATION_T.ENTITY_ID IN(tableof)但我收到同样的错误。 怎么解决这个? 我需要在 FROM 部分中选择的ID与DECODE中使用的ID之间建立关联。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我认为您在键/值对列表中添加了“NULL”并导致错误。

`1, 'SYSTEM', 2, 'TEST', NULL , 'ALL'`

在这里删除NULL