PLSQL 多行返回 ID 字段中的问题

PLSQL more than single row returned issue in ID field

我对下面的查询有疑问,主要是 SELECT 的值 ENTITY_ID 无法检索,因为我使用 LIKE 我得到了不止一个结果。 我怎样才能克服这个? 如果我放置一个内部 SELECT 例如:

    (
            SELECT
                SEC_NN_SERVER_T.SRV_ID
            FROM
                SEC_NN_SERVER_T
            WHERE
                UPPER(SEC_NN_SERVER_T.SRV_NAME) LIKE UPPER('%gen%') )       AS ENTITY_ID,

我得到同样的错误:

"ORA-01427: single-row subquery returns more than one row".

他是完整查询:

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,
21                      AS ENTITY_TYP_CODE,
(
    SELECT
        SEC_NN_SERVER_T.SRV_ID
    FROM
        SEC_NN_SERVER_T
    WHERE
        UPPER(SEC_NN_SERVER_T.SRV_NAME) LIKE UPPER('%gen%') ) AS ENTITY_ID
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%') ))))

请提前协助谢谢。

您不明白错误信息的哪一部分?您的子查询返回多行。您可以使用 rownum 或聚合来修复错误:

(SELECT MAX(SEC_NN_SERVER_T.SRV_ID)
 FROM SEC_NN_SERVER_T
 WHERE UPPER(SEC_NN_SERVER_T.SRV_NAME) LIKE UPPER('%gen%')
) as ENTITY_ID

或者也许:

(SELECT LISTAGG(SEC_NN_SERVER_T.SRV_ID, ', ') WITHIN GROUP (ORDER BY SEC_NN_SERVER_T.SRV_ID)
 FROM SEC_NN_SERVER_T
 WHERE UPPER(SEC_NN_SERVER_T.SRV_NAME) LIKE UPPER('%gen%')
) as ENTITY_IDS

但是,这可能不是您真正想要的。你需要回顾一下你所做的事情的逻辑。

通过在 select 中重复 where 子句中的子查询,您破坏了 SEC_USER_PRIV.ENTITY_ID 和子查询之间的耦合。 SELECT 部分中的子查询应始终 return 只有一个值,因为 select 构造要 returned 的行。我希望您的问题可以通过简单地包含 SEC_USER_PRIV.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,
21 AS ENTITY_TYP_CODE,
SEC_NN_SERVER_T.SRV_ID AS ENTITY_ID
FROM SEC_USER_PRIV inner join
     SEC_USER on SEC_USER.USR_ID = SEC_USER_PRIV.USR_ID inner join
     SERVER_T on SEC_USER_PRIV.ENTITY_ID = SERVER_T.SRV_ID 
             and UPPER(SERVER_T.SRV_NAME) LIKE '%GEN%'
where SEC_USER_PRIV.ENTITY_TYP_CODE = 21

看了上面回答的评论,猜测不清楚你想做什么,你可能想研究游标。下面是一个通用示例。

Declare

  cursor c_test is 
  SELECT SEC_NN_SERVER_T.SRV_ID
  FROM   SEC_NN_SERVER_T
  WHERE  UPPER(SEC_NN_SERVER_T.SRV_NAME) LIKE UPPER('%gen%') ) AS ENTITY_ID

begin

  for v_row in c_test loop

     your logic for each ID here.

  end loop;

end;