Я создаю модель данных в Oracle Fusion Financials для согласования сторон, от использования поставщика и использования клиентом. Эти стороны имеют код, который зарегистрирован на их имя. Поиск по именам таблиц в Google найдет схемы (например, HZ_PARTIES ), хотя для решения этой проблемы не обязательно видеть схемы.
Качество наших данных не совсем то, что мы хотим, чтобы это было. Чтобы убедиться, что я не пропускаю записи, мне нужно присоединиться к другим сторонам, у которых также есть код в названии.
Это то, что у меня есть, что дает результаты.
SELECT
RCTA.TRX_NUMBER
,RCTA.CT_REFERENCE
,HP.PARTY_NAME PARTY_NAME1
,HP2.PARTY_NAME PARTY_NAME2
,IEBC.IBAN CUSTOMER_IBAN
FROM
HZ_PARTIES HP,
HZ_PARTIES HP2,
IBY_ACCOUNT_OWNERS IAO,
IBY_EXT_BANK_ACCOUNTS IEBC,
RA_CUSTOMER_TRX_ALL RCTA,
HZ_CUST_ACCOUNTS HCA
WHERE 1=1
AND RCTA.BILL_TO_CUSTOMER_ID = HCA.CUST_ACCOUNT_ID (+)
AND HCA.PARTY_ID = HP.PARTY_ID(+)
AND REGEXP_SUBSTR(HP.PARTY_NAME,'([0-9]{2}[A-Z]{2}[0-9]{3})') in REGEXP_SUBSTR(HP2.PARTY_NAME,'([0-9]{2}[A-Z]{2}[0-9]{3})') -- Join on code found in party name.
AND IAO.ACCOUNT_OWNER_PARTY_ID (+) IN (HP2.PARTY_ID)
AND IAO.EXT_BANK_ACCOUNT_ID = IEBC.EXT_BANK_ACCOUNT_ID (+)
Однако это выполняет внутреннее соединение вместо внешнего соединения, которое мне нужно.
Я пробовал следующее, что дает синтаксическую ошибку (отсутствует скобка):
AND REGEXP_SUBSTR(HP.PARTY_NAME,'([0-9]{2}[A-Z]{2}[0-9]{3})') = REGEXP_SUBSTR(HP2.PARTY_NAME,'([0-9]{2}[A-Z]{2}[0-9]{3})') (+)
Также попробовал это, что заставляет запрос выполняться слишком долго. Не дождался результатов, потому что он, вероятно, неверен:
AND ( REGEXP_SUBSTR(HP.PARTY_NAME,'([0-9]{2}[A-Z]{2}[0-9]{3})') = REGEXP_SUBSTR(HP2.PARTY_NAME,'([0-9]{2}[A-Z]{2}[0-9]{3})') (+) -- Join on investor code found in party name.
OR NOT REGEXP_LIKE(HP.PARTY_NAME,'([0-9]{2}[A-Z]{2}[0-9]{3})') -- Escape to outer join in case there's no investor code in name
)
Если необходимо выполнить эту работу, я готов переписать (+) объединения в обычный синтаксис внешнего соединения.