2015-07-22 2 views
0

У меня есть сценарий, в котором мне нужно получить родительскую запись, если дочерние записи отсутствуют, показывая только родительские записи и дочерние записи как НОЛЬ. Структура представлена ​​следующим образом.Как получить родительские записи, если в oracle нет дочерних или дочерних записей

SELECT A.ROW_ID AS PARENT_ROW_ID, 
      B.ROW_ID AS CHILD_ROW_ID, 
      C.ROW_ID AS GRANDCH_ROW_ID 
    FROM MANAGER A, 
     EMPLOYEE B, 
     CONTRACTOR C 
WHERE A.ROW_ID(+) = B.PAR_ROW_ID 
    AND B.ROW_ID = C.PAR_ROW_ID 
    AND A.ROW_ID IN ('1-HC3') 

Итак, когда я выполняю это все, он возвращает нулевые записи вместо того, чтобы давать мне родительские записи. Конечно, с другой стороны, есть и другие записи, у которых есть дочерние записи, и они поступают должным образом. Пожалуйста, предложите мне, что делать в этом случае

+1

Почему у вас только один оператор внешнего соединения? Возможно, вам будет легче понять это, если вы используете синтаксис ANSI join. –

ответ

2

Изменение запроса использовать ANSI присоединяется делает его намного понятнее, какие условия соединения являются:

SELECT A.ROW_ID AS PARENT_ROW_ID, 
     B.ROW_ID AS CHILD_ROW_ID, 
     C.ROW_ID AS GRANDCH_ROW_ID 
FROM MANAGER A 
     LEFT OUTER JOIN 
     EMPLOYEE B ON (A.ROW_ID = B.PAR_ROW_ID) 
     LEFT OUTER JOIN 
     CONTRACTOR C ON (B.ROW_ID = C.PAR_ROW_ID) 
WHERE A.ROW_ID = '1-HC3' 

Edit - Для того, чтобы ответить на ваш комментарий

Просто проверьте, является ли этот тип одним из тех, который вы хотите, или иным образом, если он равен NULL.

SELECT A.ROW_ID AS PARENT_ROW_ID, 
     B.ROW_ID AS CHILD_ROW_ID, 
     C.ROW_ID AS GRANDCH_ROW_ID 
FROM MANAGER A 
     LEFT OUTER JOIN 
     EMPLOYEE B ON (A.ROW_ID = B.PAR_ROW_ID) 
     LEFT OUTER JOIN 
     CONTRACTOR C ON (B.ROW_ID = C.PAR_ROW_ID) 
WHERE A.ROW_ID = '1-HC3' 
AND ( B.TYPE IN ('SALES', 'MARKET', 'HR') 
     OR B.TYPE IS NULL) 
+0

Спасибо! Когда я вижу структуру данных, я обнаружил, что большой ребенок присутствует в той же таблице, что и дочерний. В детской таблице много типов. Существуют значения для некоторых типов. Но нет значения для типа, и это также должно быть показано NULL. Я пробовал ниже, но он не извлекал данные для типа, которого нет в дочерней таблице. SELECT A.ROW_ID AS PARENT_ROW_ID, B.ROW_ID AS CHILD_ROW_ID, C.ROW_ID AS GCH_ROW_ID FROM MANAGR LEFT OUTER JOIN EMP B ON (A.ROW_ID = B.PAR_ROW_ID) LEFT OUTER JOIN EMP C ON (B.ROW_ID = C. PAR_NEW_ID) WHERE B.TYPE IN («ПРОДАЖИ», «РЫНОК», «HR») A.ROW_ID = '1-HC3' –

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