ORACLE BIPUBLISHER SQL查询执行时间过长

时间:2020-02-19 09:39:50

标签: sql oracle

以下是查询

Select
pu.username,
ROLE.ROLE_NAME,
(
CASE
WHEN ((ROLE.ORG_ID IS NOT NULL) AND ROLE.ORG_ID=fabuv.BU_ID) THEN FABUV.BU_NAME
WHEN ((ROLE.LEDGER_ID IS NOT NULL) AND ROLE.LEDGER_ID=gl.LEDGER_ID) THEN GL.NAME
WHEN ((ROLE.BOOK_ID IS NOT NULL) AND ROLE.BOOK_ID=fbc.BOOK_CONTROL_ID) THEN FBC.BOOK_TYPE_NAME
WHEN ((ROLE.SET_ID IS NOT NULL) AND ROLE.SET_ID=fssv.SET_ID) THEN FSSV.SET_NAME
WHEN ((ROLE.INV_ORGANIZATION_ID IS NOT NULL) AND ROLE.INV_ORGANIZATION_ID=iop.ORGANIZATION_ID) THEN IOP.ORGANIZATION_CODE
WHEN ((ROLE.CST_ORGANIZATION_ID IS NOT NULL) AND ROLE.CST_ORGANIZATION_ID=ccov.COST_ORG_ID) THEN CCOV.COST_ORG_CODE
WHEN ((ROLE.ACCESS_SET_ID IS NOT NULL) AND ROLE.ACCESS_SET_ID=gas.ACCESS_SET_ID) THEN GAS.NAME
WHEN ((ROLE.CONTROL_BUDGET_ID IS NOT NULL) AND ROLE.CONTROL_BUDGET_ID=xcb.CONTROL_BUDGET_ID) THEN XCB.NAME
WHEN ((ROLE.INTERCO_ORG_ID IS NOT NULL) AND ROLE.INTERCO_ORG_ID=fio.INTERCO_ORG_ID) THEN FIO.INTERCO_ORG_NAME
ELSE 'NOT_APPLICABLE'
END
) "Security_Context_Value"
from
fusion.per_users pu,
fusion.FA_BOOK_CONTROLS FBC,
fusion.FUN_ALL_BUSINESS_UNITS_V FABUV,
fusion.XCC_CONTROL_BUDGETS XCB,
fusion.CST_COST_ORGS_V CCOV,
fusion.gl_access_sets GAS,
fusion.FUN_INTERCO_ORGANIZATIONS FIO,
fusion.INV_ORG_PARAMETERS iOP,
fusion.GL_LEDGERS GL,
fusion.RCS_MFG_PARAMETERS RMP,
fusion.FUN_USER_ROLE_DATA_ASGNMNTS ROLE,
fusion.FND_SETID_SETS_VL FSSV
where
1=1
and pu.USERNAME=:Username
AND ROLE.ORG_ID != NULL
OR ROLE.LEDGER_ID != NULL
OR ROLE.BOOK_ID != NULL
OR ROLE.SET_ID != NULL
OR ROLE.INV_ORGANIZATION_ID != NULL
OR ROLE.CST_ORGANIZATION_ID != NULL
OR ROLE.ACCESS_SET_ID != NULL
OR ROLE.CONTROL_BUDGET_ID != NULL
OR ROLE.INTERCO_ORG_ID != NULL
And pu.USER_GUID=role.USER_GUID

这是提取分配给具有Security_Context和Value的用户的角色所需的查询。 我尝试使用IS NOT NULL代替'!='的不同组合,但它也无济于事,如果运行,则不会考虑用户名。

1 个答案:

答案 0 :(得分:0)

我认为您追求的是类似的东西

SELECT pu.username,
     role.role_name,
     CASE WHEN ROLE.ORG_ID IS NOT NULL THEN FABUV.BU_NAME
            WHEN ROLE.LEDGER_ID IS NOT NULL THEN GL.NAME
            WHEN ROLE.BOOK_ID IS NOT NULL THEN FBC.BOOK_TYPE_NAME
            WHEN ROLE.SET_ID IS NOT NULL THEN FSSV.SET_NAME
            WHEN ROLE.INV_ORGANIZATION_ID IS NOT NULL THEN IOP.ORGANIZATION_CODE
            WHEN ROLE.CST_ORGANIZATION_ID IS NOT NULL THEN CCOV.COST_ORG_CODE
            WHEN ROLE.ACCESS_SET_ID IS NOT NULL THEN GAS.NAME
            WHEN ROLE.CONTROL_BUDGET_ID IS NOT NULL THEN XCB.NAME
            WHEN ROLE.INTERCO_ORG_ID IS NOT NULL THEN FIO.INTERCO_ORG_NAME
            ELSE 'NOT_APPLICABLE'
       END "Security_Context_Value"
FROM   fusion.per_users pu
       INNER JOIN fusion.fun_user_role_data_asgnmnts role ON pu.user_guid = role.user_guid
       LEFT OUTER JOIN fusion.fun_all_business_units_v fabuv ON role.org_id = fabuv.bu_id
       LEFT OUTER JOIN fusion.gl_ledgers gl ON role.ledger_id = gl.ledger_id
       LEFT OUTER JOIN fusion.fa_book_controls fbc ON role.book_id=fbc.book_control_id
       LEFT OUTER JOIN fusion.fnd_setid_sets_vl fssv ON role.SET_ID=fssv.SET_ID
       LEFT OUTER JOIN fusion.inv_org_parameters iop ON role.inv_organization_id=iop.organization_id
       LEFT OUTER JOIN fusion.cst_cost_orgs_v ccov ON role.cst_organization_id=ccov.cost_org_id
       LEFT OUTER JOIN fusion.gl_access_sets gas ON role.access_set_id=gas.access_set_id
       LEFT OUTER JOIN fusion.xcc_control_budgets xcb ON role.control_budget_id=xcb.control_budget_id
       LEFT OUTER JOIN fusion.fun_interco_organizations fio ON role.interco_org_id=fio.interco_org_id
WHERE  pu.username = :username
AND    COALESCE(role.org_id,
                role.ledger_id,
                role.book_id,
                role.set_id,
                role.inv_organization_id,
                role.cst_organization_id,
                role.access_set_id,
                role.control_budget_id,
                role.interco_org_id) IS NOT NULL;

请注意使用ANSI连接语法,这会强制您添加连接条件(除非您明确请求交叉连接)。

您原来的查询是在fabuvglfbc等表之间进行交叉联接,这意味着fabuv中的每一行都被联接到其中的所有行gl,并且每个结果行都被连接到fbc表中的每一行,依此类推...这是 lot 行-例如如果每个fabuvglfbc等表中都有100行,那么最终将得到100 x 100 x 100 x ...行太多了。

根据您的case语句-n.b,我猜测了连接条件应该是什么。 rmp表根本没有被引用,因此我将其从from子句中排除了。

我还使用了COALESCE函数来简化您的where子句-此函数返回第一个非空值。

相关问题