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;
我对下面的查询有疑问,主要是 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;