2015-12-30 3 views
0

У меня есть проблема с ниже запросом, в главном ВЫБОР значение ENTITY_ID не может быть восстановлен, так как я использую, как я получить больше одиночный результат задний. Как я могу это преодолеть? Если я поместить внутренний ВЫБРАТЬ, такие как:PLSQL более одной строки, возвращаемой вопрос в поле ИД

(
      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, 

я получаю ту же ошибку:

«ОР-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%'))))) 

Пожалуйста помогите заранее спасибо.

ответ

1

Повторяя подзапрос из вашего предложения where в вашем выборе, вы уничтожаете связь между SEC_USER_PRIV.ENTITY_ID и подзапросом. Подзапросы в части SELECT должны всегда возвращать только одно значение, потому что select строит возвращаемую строку. Я ожидаю, что ваша проблема будет решена просто включением SEC_USER_PRIV.ENTITY_ID вместо подзапроса.

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 

Однако, это не может быть то, что вы действительно хотите. Вам нужно пересмотреть логику того, что вы делаете.

+0

Я рассмотрел использование LISTAGG, но это не соответствует моим потребностям. То же самое для MAX, поскольку оно вернет только один из существующих идентификаторов. –

+0

@DavidFaiz. , , Вы должны задать другой вопрос, предоставив образцы данных, желаемые результаты и логику, которую вы хотите реализовать. –

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 
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; 
Смежные вопросы