СЛУЧАЙ, КОГДА ВЫБРАТЬ, какой список значений вернуть ORACLE SQL - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь использовать случай, когда для обеспечения некоторой безопасности доступа к данным, которая не является стандартной.

Основы того, что я пытаюсь сделать, продолжают вызывать ошибку "больше чем одна строка".

Я хочу использовать 2 разных подзапроса с результатом случая при определении того, какой список будет возвращен.

Пример logi c

SELECT CASE 

WHEN condition 1 is true THEN (SUBQUERY 1)
WHEN condition 2 is true THEN (SUBQUERY 2)
END AS ACCESS

FROM DUAL

Оба подзапроса работают там самостоятельно уточните и верните правильные значения, поместите их в скобки выше, и это не удастся.

SUBQUERY 1

SELECT DISTINCT FND.PK1_START_VALUE 
FROM FND_GRANTS FG

JOIN FND_OBJECTS_VL FO
    ON FO.OBJECT_ID = FG.OBJECT_ID

JOIN FND_FORM_FUNCTIONS_VL FFF
    ON FO.OBJECT_ID = FFF.OBJECT_ID

JOIN FND_MENU_ENTRIES FME
    ON FME.MENU_ID  = FG.MENU_ID AND FFF.FUNCTION_ID = FME.FUNCTION_ID

LEFT JOIN FND_OBJECT_INSTANCE_SETS_VL FOIS
    ON FG.INSTANCE_SET_ID = FOIS.INSTANCE_SET_ID

JOIN FND_SESSION_ROLES FSR
    ON FG.ROLE_NAME  = FSR.ROLE_NAME

JOIN FND_SESSIONS FS
    ON FS.SESSION_ID = FSR.SESSION_ID

LEFT JOIN FND_FLEX_VALUES_VL FLV
ON FLV.DESCRIPTION = SUBSTR(FG.NAME, 1, CASE WHEN INSTR(FG.NAME,'Area')< 1 THEN INSTR(FG.NAME,'Cost')-2)
ELSE (INSTR(FG.NAME,'Area')-2)
END)

JOIN FND_TREE_NODE FND
    ON FLV.FLEX_VALUE = FND.PARENT_PK1_VALUE

WHERE FG.ROLE_NAME IN (:P_ROLE)----:P_ROLE is a list of VALUES fetching back the users system access.
AND FND.TREE_STRUCTURE_CODE = 'GL_ACCT_FLEX'
AND FND.TREE_CODE ='Cost Centre-T'
AND FND.DEPTH ='4'
ORDER BY FND.PK1_START_VALUE ASC)

SUBQUERY 2 ---- идея в том, что пользователь не имеет ни одной из ролей в P_ROLE и, следовательно, имеет доступ ко всем разделам

SELECT DISTINCT FND.PK1_START_VALUE
FROM FND_TREE_NODE FND

WHERE FND.TREE_STRUCTURE_CODE IN('GL_ACCT_FLEX')
AND FND.TREE_CODE IN('Cost Centre-T')
AND FND.DEPTH IN('4')

ПРИМЕЧАНИЕ. Некоторые конфиденциальные данные были удалены из запроса и заменены

Ответы [ 3 ]

0 голосов
/ 20 апреля 2020

Один (простой) вариант - UNION их:

select columns 
  from subquery_1
  where condition = 1
union all
select columns 
  from subquery_2
  where condition = 2
0 голосов
/ 20 апреля 2020

Вы можете сделать что-то вроде ниже, используя CASE

        WITH sub1
         AS (SELECT ROWNUM rw,
                    data
             FROM   sub_query1),
         sub2
         AS (SELECT ROWNUM rw,
                    data
             FROM   sub_query2)
    SELECT CASE
             WHEN condition1 = 1 THEN a1.data
             WHEN condition1 = 2 THEN b1.data
             ELSE NULL
           END case1
    FROM   sub1 a1
           full outer join sub2 b1
                        ON a1.rw = b1.rw 
0 голосов
/ 20 апреля 2020

Хммм. , , Я думаю, что вы хотите union all:

SELECT q1.*
FROM (SUBQUERY 1) q1
WHERE condition1
UNION ALL
SELECT q2.*
FROM (SUBQUERY 2) q1
WHERE (NOT condition 1) AND  -- may not be necessary
      (condition 2) is true ;

Примечание. Предполагается, что столбцы, возвращаемые каждым подзапросом, совместимы - как по количеству, так и по типам. Имя в наборе результатов берется из первого подзапроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...