Я столкнулся с вопросом во время работы и не смог понять, как именно он работает. То, что делает запрос, - это поиск всех родителей для лица, которое является его родителем сегодня.Иерархические запросы «НАЧАТЬ С», где поведение предложения
Теперь уловка в том, что каждое родительское дочернее отношение имеет продолжительность, для которой она действительна.
Возьмите этот набор данных в качестве ссылки:
GrandParent является родителем Отца от 01.01.2012 до 02-02-2015
Отец родитель ребенка от 01.01.2012 до 02.02.2011
Ребенок просто самый низкий уровень человек
NewFather является родителем ребенка от 01.01.2012 до 02-02-2014
теперь список родителей действуют сегодня для ребенка должен состоять только из NewFather
, чтобы получить список, ранее мы использовали этот SQL:
SELECT connect_by_root per_id2 AS per_id2,
per_id1,
LEVEL AS per_level,
n.entity_name
FROM ci_per_per pp,
ci_per_name N
WHERE N.per_id = per_id1
AND start_dt <= SYSDATE
AND (end_dt IS NULL
OR end_dt >= SYSDATE)
START WITH per_id2 = :personID
CONNECT BY NOCYCLE PRIOR per_id1 = per_id2;
где personID
является переплетен переменной
этот запрос не работал, потому что поведение предложения where таково, что оно сначала получает все записи, а затем проверяет условия отсутствия соединения (проверяет дату начала и дату окончания). Это приводит к тому, что он дает список родителей как NewFather, GrandParent
, что полностью НЕПРАВИЛЬНО!
Таким образом, запрос был изменен на следующее:
SELECT connect_by_root per_id2 AS per_id2,
per_id1,
LEVEL AS per_level,
n.entity_name
FROM ci_per_per pp,
ci_per_name N
WHERE N.per_id = per_id1
AND start_dt <= SYSDATE
AND (end_dt IS NULL
OR end_dt >= SYSDATE)
START WITH per_id2 = (SELECT per_id
FROM ci_acct_per
WHERE per_id = :personID
AND pp.start_dt <= SYSDATE
AND (pp.end_dt IS NULL
OR pp.end_dt >= SYSDATE))
CONNECT BY NOCYCLE PRIOR per_id1 = per_id2;
Теперь то, что я не понимаю:
как можно где условие в начале с п влияют на поведение запрос таким образом?
Другое дело, что я не люблю об этом запросе в том, что он использует совершенно не связанную таблицу с именем ci_acct_per
, который просто имеет столбец per_id
в нем для каждого человека в ci_per_per
.
Можем ли мы сделать лучше? Доступен ли более чистый подход для исправления исходного запроса?
UPDATE
Этот запрос работает только при путешествии выше в иерархии и нет, если мы ищем ребенок. Однако этот запрос никогда не ищет детей и не должен.
пожалуйста, помогите ребятам! – MozenRath