2016-09-09 9 views
0

у меня есть это в этой таблице, где яКак я могу показать родительский элемент данных, используя соединение по-прежнему?

> parentitem | childitem  ---table name 
    ------------------------------- 
    dinner  |  steak 
    dinner  |  wine 
    dinner  |  mashed potato 
    dinner  |  coffee 
    coffee  |  sugar 
    coffee  |  water 
    dinner  |  cake 
    cake  |  liquid syrup 
    cake  |  egg 

я хочу, чтобы получить весь ChildItem из «обеда» с помощью подключения по предварительному я использовал код Ф.Ф.

Select Level, LPAD('->',2*(LEVEL-1))||CHILDITEM 
From table 
Start With parentitem = 'dinner' 
Connect By Prior childitem = parentitem 

но не включает родитель элемент, который является «ужином», но он правильно производит все детские предметы ужина. Кстати, мой друг намекнул мне на использование союза. им с помощью Oracle SQL

поэтому мой ожидаемый результат

LEVEL | CHILDITEM 
-------------------- 
    0 |  dinner 
    1 |  steak 
    1 |  wine 
    1 |  mashed potato 
    1 |  coffee 
    2 |   sugar 
    2 |   water 
    1 |  cake 
    2 |   liquid syrup 
    2 |   egg 
+1

Не маркировать продукты не участвуют. Вы можете поместить один из тегов назад, тот, который вы используете для dbms. – jarlh

+0

Итак, каков ваш ожидаемый результат – XING

+0

CONNECT_BY_ROOT должен работать? – daZza

ответ

0
WITH roots (parentitem) AS (
    SELECT 'dinner' FROM DUAL 
) 
SELECT DISTINCT 
     0 AS "level", 
     parentitem AS childitem 
FROM table_name t 
     INNER JOIN roots r 
     ON (t.parentitem = r.parentitem) 
UNION ALL 
SELECT LEVEL, 
     LPAD(' ', LEVEL * 2, ' ') || childitem 
FROM table_name 
START WITH parentitem IN (SELECT parentitem FROM roots) 
CONNECT BY PRIOR childitem = parentitem;