Как обойти сценарий parent-child без использования классического способа или без использования условия where - PullRequest
0 голосов
/ 27 июня 2019

Я ищу обходной путь, который работает как parent-child, но без использования рекурсивного поиска. Я не могу использовать временные таблицы.

ЭТОТ СКРИПТ РАБОТАЕТ, но медленно, всегда работает в течение 600 с .:

SELECT CONNECT_BY_ROOT party_id as ANCESTOR, 
       party_id, role_id, subject_id
FROM onecrm.CRM_PARTY 
WHERE LEVEL>1 
and party_id = 'text'
CONNECT BY PRIOR Party_id=parent_id;

Это хорошо работает, но содержит 3 шага. Мне нужно использовать только один шаг из-за совокупности задач.

select internal_id, party_id, parent_id, subject_id, channel_type_id 
from onecrm.O_ORDER oo 
  join onecrm.CRM_PARTY cp on oo.party_ref_no = cp.party_ref_no 
where internal_id = 'O7VYECF';

Результат:

INTERNAL_ID, PARTY_ID, PARENT_ID, SUBJECT_ID, CHANNEL_TYPE_ID
O7VYECF     110179237   110179236  null           CRM
select internal_id, cp.party_id, parent_id
from onecrm.O_ORDER oo 
  right join onecrm.CRM_PARTY cp on oo.party_ref_no = cp.party_ref_no 
where cp.party_id = '110179236';

Результат:

INTERNAL_ID, PARTY_ID, PARENT_ID
OAMUAY7      110179236  null
select internal_id, cp.party_id, parent_id, cp.subject_id, 
       channel_type_id, full_name, phone_no_1, phone_no_2, email, segment
from onecrm.O_ORDER oo 
  right join onecrm.CRM_PARTY cp on oo.party_ref_no = cp.party_ref_no 
  left join onecrm.CRM_SUBJECT cs on cs.SUBJECT_ID = cp.SUBJECT_ID
  left join onecrm.crm_contact_ref ccr on ccr.conre_ref_no = cs.subj_ref_no
  left join onecrm.CRM_CONTACT_EXT cce on cce.contact_id = ccr.contact_id 
where cp.party_id = '110179236';

Ожидаемый результат:

INTERNAL_ID, PARTY_ID, PARENT_ID, SUBJECT_ID, CHANNEL_TYPE_ID, FULL_NAME, PHONE_NO_1, PHONE_NO_2, EMAIL, SEGMENT

OAMUAY7   110179236 null    102219217   TGB great_company s.r.o.                
xxx            xxx      TNC     RNC

Ожидаемый результат - только запись internal_id и получение parent_id INFO

1 Ответ

1 голос
/ 27 июня 2019

В исходном запросе connect by нет предложения start with.Это означает, что он вычисляет дерево для каждой строки в таблице!

Затем он применяет предложение where к сгенерированному дереву.

Например, следующие сборкиначало дерева для строк C1 = 1, C1 = 2 и C1 = 3:

create table t as 
  select level c1, level - 1 c2 
  from   dual
  connect by level <= 3;

select t.*, 
       connect_by_root c1 rt
from   t
connect by prior c1 = c2;

C1    C2    RT   
    1     0     1 
    2     1     1 
    3     2     1 
    2     1     2 
    3     2     2 
    3     2     3 

Когда вы загрузите больше данных в таблицу, это очень быстро замедлит ваш запрос для сканирования.

Даже если ваше предложение where означает, что вы получаете только несколько строк назад, вы, скорее всего, будете обрабатывать огромный набор данных.

Чтобы избежать этого, вы почти наверняка захотите start with пункт.Это определяет, какая строка является корнем дерева:

select t.*, 
       connect_by_root c1 rt
from   t
start  with c1 = 1
connect by prior c1 = c2;

C1    C2    RT   
    1     0     1 
    2     1     1 
    3     2     1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...