0

我对下面的查询有疑问,在主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:单行子查询返回多行”。

他是完整的查询:

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%') ))))

请协助提前谢谢。

4

4 回答 4

1

您不理解错误消息的哪一部分?您的子查询返回不止一行。您可以通过使用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

但是,这可能不是您真正想要的。你需要检查你正在做的事情的逻辑。

于 2015-12-30T12:39:23.860 回答
1

通过在您的选择中从 where 子句重复子查询,您会破坏 SEC_USER_PRIV.ENTITY_ID 和子查询之间的耦合。SELECT 部分中的子查询应该始终只返回一个值,因为 select 构造了要返回的行。我希望您的问题将通过简单地包含 SEC_USER_PRIV.ENTITY_ID 而不是子查询来解决。

于 2015-12-30T14:08:52.797 回答
0

查看上述答案的评论,并猜测您不清楚您想要做什么,您可能想调查游标。下面是一个通用示例。

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;
于 2016-01-04T03:06:17.080 回答
0

你可以试试下面的查询

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
于 2016-01-03T05:50:16.233 回答