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

select の where 句からサブクエリを繰り返すことで、SEC_USER_PRIV.ENTITY_ID とサブクエリの間の結合を破壊します。選択は返される行を構築するため、SELECT 部分のサブクエリは常に 1 つの値のみを返す必要があります。サブクエリの代わりに SEC_USER_PRIV.ENTITY_ID を含めるだけで問題が解決すると思います。

于 2015-12-30T14:08:52.797 に答える
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 に答える
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 に答える