我正在尝试使用一个案例来强制执行一些非标准的数据访问安全性。
我正在尝试做的基本操作仍然会导致“多行”错误。
当决定返回哪个列表时,我想使用两个不同的子查询和案例的结果。
示例逻辑
SELECT CASE
WHEN condition 1 is true THEN (SUBQUERY 1)
WHEN condition 2 is true THEN (SUBQUERY 2)
END AS ACCESS
FROM DUAL这两个子查询都工作正常,并取回正确的值,将它们放在上面的括号中,它就失败了。
子查询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-此处的idea是指用户在P_ROLE中没有任何角色,因此对所有部分具有all访问权限
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')请注意,查询中的某些敏感数据已被编辑并替换
发布于 2020-04-20 20:19:19
一种(简单的)选项是对它们执行UNION:
select columns
from subquery_1
where condition = 1
union all
select columns
from subquery_2
where condition = 2发布于 2020-04-20 20:18:54
嗯。。。我觉得你想要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 ;注意:这假设每个子查询返回的列在数量和类型上都是兼容的。结果集中的名称取自第一个子查询。
发布于 2020-04-20 20:29:31
您可以执行类似以下用例的操作
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 https://stackoverflow.com/questions/61322334
复制相似问题