2015-12-06 1 views
1

У меня есть таблица в Oracle (12c), которая мне нужна для извлечения данных.
Таблица называется ACCOUNT_ANALYSIS_FY16. Эта таблица содержит трехуровневую иерархию предприятий. Позиция в этой иерархии обозначается столбцом DUNS_LEVEL, значением которого является DUNS (что означает самый низкий уровень бизнеса), IMMEDIATE (что означает уровень 2, aka Parent of DUNS level) или ULTIMATE (значение уровня 3 или родительский элемент СРОЧНАЯ).Как перемещаться по таблице в Oracle SQL

Applicable columns are: 
NN_NAME - Account Name 
DUNS_LEVEL 
DUNS 
ULTIMATE_PARENT_DUNS 
IMMEDIATE_PARENT_DUNS 

Требование ... для данного имени учетной записи (и может быть несколько вхождений одного и того же имени учетной записи из-за разных местах), мне нужно, чтобы увидеть все об этой учетной записи (ака SELECT *), AS ХОРОШО все, что касается Непосредственного родителя и Конечного родителя данной учетной записи.

Я написал это в SQL, но он включает в себя 5 операторов SELECT. Я знаю, что должен быть более элегантный и простой способ сделать это. Обратите внимание, что конечный результат заключается в том, чтобы поместить это в анонимный блок PL/SQL, поэтому допустимо написать блок PL/SQL, если это лучшее решение.

Вот прямой SQL, что у меня есть, который работает ...

Select *from ACCOUNT_ANALYSIS_FY16 where NN_NAME = 'XYZ GROUP' 
union 
Select * from ACCOUNT_ANALYSIS_FY16 where DUNS in (Select IMMEDIATE_PARENT_DUNS from ACCOUNT_ANALYSIS_FY16 where NN_NAME = 'XYZ GROUP') 
union 
Select * from ACCOUNT_ANALYSIS_FY16 where DUNS in (Select ULTIMATE_PARENT_DUNS from ACCOUNT_ANALYSIS_FY16 where NN_NAME = 'XYZ GROUP') 

Благодарности

+0

могли бы вы сделать это в виде иерархического запроса не реально уверен, что структура ваших данных, поэтому вам, возможно, придется поиграть с ним, но что-то вроде выбора. *, level, sys_connect_by_path (nm_name, '/') «Путь» from account_analysis_fy16 a Начало с ultimate_parent_duns равно null и nm_name = 'XYZ Group' connect by previous_parent_duns = ultimate_parent_duns или предыдущие duns = direct_parent_duns; –

+0

Честно говоря, мне нравится исходный SQL. Понятно, что он делает, и его легко читать. Если нет проблемы с производительностью, я не вижу причин ее менять. –

ответ

1

Try:

SELECT * 
FROM ACCOUNT_ANALYSIS_FY16 t 
WHERE NN_NAME = 'XYZ GROUP' 
    OR EXISTS (
    SELECT NULL 
    from ACCOUNT_ANALYSIS_FY16 t1 
    WHERE t.DUNS IN (t1.ULTIMATE_PARENT_DUNS, t1.IMMEDIATE_PARENT_DUNS) 
     AND t1.NN_NAME = 'XYZ GROUP' 
) 
+0

Как только я добавил соответствующие индексы, это сделало именно то, что мне было нужно. – user1009073

Смежные вопросы