首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >选择要带回ORACLE SQL的值列表的情况

选择要带回ORACLE SQL的值列表的情况
EN

Stack Overflow用户
提问于 2020-04-20 20:16:56
回答 3查看 175关注 0票数 0

我正在尝试使用一个案例来强制执行一些非标准的数据访问安全性。

我正在尝试做的基本操作仍然会导致“多行”错误。

当决定返回哪个列表时,我想使用两个不同的子查询和案例的结果。

示例逻辑

代码语言:javascript
复制
SELECT CASE 

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

FROM DUAL

这两个子查询都工作正常,并取回正确的值,将它们放在上面的括号中,它就失败了。

子查询1

代码语言:javascript
复制
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访问权限

代码语言:javascript
复制
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')

请注意,查询中的某些敏感数据已被编辑并替换

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-20 20:19:19

一种(简单的)选项是对它们执行UNION

代码语言:javascript
复制
select columns 
  from subquery_1
  where condition = 1
union all
select columns 
  from subquery_2
  where condition = 2
票数 0
EN

Stack Overflow用户

发布于 2020-04-20 20:18:54

嗯。。。我觉得你想要union all

代码语言:javascript
复制
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 ;

注意:这假设每个子查询返回的列在数量和类型上都是兼容的。结果集中的名称取自第一个子查询。

票数 0
EN

Stack Overflow用户

发布于 2020-04-20 20:29:31

您可以执行类似以下用例的操作

代码语言:javascript
复制
        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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61322334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档