Я рекомендую избегать коррелированных подзапросов в предложениях select, они часто являются причиной низкой производительности запросов.Я также подозреваю , что используемая в настоящее время корреляция может быть неверной таблицей owner_table_name = 'HZ_PARTY_SITES'
указывает, что эти данные должны относиться к таблице apps.hz_party_sites
, но я не могу быть уверен в этом, поскольку не знаю ваших данных
Ниже я предложил один подзапрос «производная таблица» вместо используемых в настоящее время корреляций.
SELECT
hp.party_name customer_name
, hca.account_number
, hca.cust_account_id
, customer_id
--, hcsu.LOCATION customer_site_name
, hcas.cust_acct_site_id customer_site_id
, hcp.phone_number
, hcp.email_address
, hl.address1
, hl.address2
, hl.address3
, hl.address4
, hl.city
, hl.province
, hl.postal_code
, hcas.status site_status
, DECODE( hcas.attribute5, 'PUP', 'Y', 'N' ) usage_type
, hca.status account_status
FROM apps.hz_cust_accounts hca
INNER JOIN apps.hz_cust_acct_sites_all hcas ON hca.cust_account_id = hcas.cust_account_id
INNER JOIN apps.hz_party_sites hps ON hcas.party_site_id = hps.party_site_id
INNER JOIN apps.hz_locations hl ON hps.location_id = hl.location_id
INNER JOIN apps.hz_parties hp ON hps.party_id = hp.party_id
LEFT JOIN (
SELECT
owner_table_id
, max(case when contact_point_type = 'PHONE' then phone_number end) phone_number
, max(case when contact_point_type = 'EMAIL' then email_address end) email_address
FROM hz_contact_points
WHERE status = 'A'
AND primary_flag = 'Y'
AND owner_table_name = 'HZ_PARTY_SITES'
AND contact_point_type IN ('EMAIL','PHONE')
GROUP BY
owner_table_id
) hcp ON hcas.cust_acct_site_id = hcp.owner_table_id /* not sure of this join */
AND hcp.rn = 1
WHERE hcas.status = 'A'
AND hps.status = 'A'
AND hca.status = 'A'
AND hca.account_number = 'number account'
;
кстати NVL(column,NULL)
ничего не дает, если column
уже NULL, тогда он будет NULL без необходимости NVL
Кроме того, более 25 лет назад стандарты ANSI официально оформленысинтаксис соединения, и это также должно быть принято.
преобразовывая ваши "объединения", я всегда начинаю с деления строки от запятой:
FROM apps.hz_cust_accounts hca
, apps.hz_cust_acct_sites_all hcas
, apps.hz_parties hp
, apps.hz_party_sites hps
, apps.hz_locations hl
Затем заменяемзапятые с INNER JOIN
и помещением ON
в конце каждой такой строки
FROM apps.hz_cust_accounts hca
INNER JOIN apps.hz_cust_acct_sites_all hcas ON
INNER JOIN apps.hz_parties hp ON
INNER JOIN apps.hz_party_sites hps ON
INNER JOIN apps.hz_locations hl ON
Затем я вырезал предикаты объединения из предложения where до их необходимого местоположения, следя за тем, чтобы каждое соединение теперь ссылалось на таблицуВЫШЕ (мне пришлось переместить один из-за этого)
FROM apps.hz_cust_accounts hca
INNER JOIN apps.hz_cust_acct_sites_all hcas ON hca.cust_account_id = hcas.cust_account_id
INNER JOIN apps.hz_party_sites hps ON hcas.party_site_id = hps.party_site_id
INNER JOIN apps.hz_locations hl ON hps.location_id = hl.location_id
/* had to move this down */
INNER JOIN apps.hz_parties hp ON hps.party_id = hp.party_id