Я думаю, что вы ищете что-то вроде:
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
, et c, то есть каждая строка в fabuv
была объединена со всеми строками в gl, и каждая из результирующих строк соединялась с каждой строкой в таблице fbc
и т. д. ... это партия строк - например, если в каждой из fabuv
есть 100 строк, gl
, fbc
и т. Д. 1026 * таблиц, в итоге вы получите 100 x 100 x 100 x ... что в итоге окажется слишком большим количеством строк.
Я взял предположение о том, какими должны быть условия соединения, исходя из вашего оператора case - хотя на таблицу rmp
вообще не ссылались, поэтому я исключил ее из предложения from
.
Я также использовал функцию COALESCE
, чтобы упростить ваше предложение where
- эта функция возвращает первое ненулевое значение.