以下是查询
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代替'!='的不同组合,但它也无济于事,如果运行,则不会考虑用户名。
答案 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连接语法,这会强制您添加连接条件(除非您明确请求交叉连接)。
您原来的查询是在fabuv
,gl
,fbc
等表之间进行交叉联接,这意味着fabuv
中的每一行都被联接到其中的所有行gl,并且每个结果行都被连接到fbc
表中的每一行,依此类推...这是 lot 行-例如如果每个fabuv
,gl
,fbc
等表中都有100行,那么最终将得到100 x 100 x 100 x ...行太多了。
根据您的case语句-n.b,我猜测了连接条件应该是什么。 rmp
表根本没有被引用,因此我将其从from
子句中排除了。
我还使用了COALESCE
函数来简化您的where
子句-此函数返回第一个非空值。