Получение адреса электронной почты основного контакта (запрос не работает должным образом) - PullRequest
0 голосов
/ 24 декабря 2018

Я безуспешно пытался получить всю контактную информацию определенного клиента, учитывая номер его счета (я хотел получить основной набор адресов электронной почты для этого клиента - если таковой имеется)

Это мойв первый раз, используя EBS, и есть много таблиц, и я думаю, что я что-то упустил, потому что мой запрос не работает должным образом.Это показывает мне разные электронные письма, но я думаю, что это не правильно.

Можете ли вы помочь мне с этим?

Это мой запрос:

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, hl.address1,hl.address2,
       hl.address3,hl.address4,hl.city, hl.province, hl.postal_code,
       NVL ((SELECT DISTINCT phone_number
             FROM hz_contact_points
             WHERE status = 'A'
             AND primary_flag = 'Y'
             AND owner_table_name = 'HZ_PARTY_SITES'
             AND contact_point_type = 'PHONE'
             AND owner_table_id = hcas.cust_acct_site_id
             AND ROWNUM = 1), NULL) phone_number,
       NVL ((SELECT DISTINCT email_address
             FROM hz_contact_points
             WHERE status = 'A'
             AND primary_flag = 'Y'
             AND owner_table_name = 'HZ_PARTY_SITES'
             AND contact_point_type = 'EMAIL'
             AND owner_table_id = hcas.cust_acct_site_id
             AND ROWNUM = 1), NULL) email,
       hcas.status site_status,
       DECODE (hcas.attribute5, 'PUP', 'Y', 'N') usage_type,
       hca.status account_status
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
WHERE hca.cust_account_id = hcas.cust_account_id
AND hcas.party_site_id = hps.party_site_id
AND hps.location_id = hl.location_id
AND hps.party_id = hp.party_id
AND hcas.status = 'A'
AND hps.status = 'A'
AND hca.status = 'A'
AND hca.account_number='number account'

1 Ответ

0 голосов
/ 24 декабря 2018

Я рекомендую избегать коррелированных подзапросов в предложениях 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...