2015-01-14 7 views
0

Я получилLEFT OUTER JOIN с CONNECT_BY_ROOT

SELECT 
    CONNECT_BY_ROOT TAXY.IDCATEGORY AS IDBRANCH 
    , TAXY.IDCATEGORY 
    , TAXY.IDPARENTCATEGORY 
    , TAXY.IDCONTENT 
    , TAXY.CATEGORYNAME 
    , LEVEL AS LVL 
FROM TAXONOMY TAXY 
CONNECT BY TAXY.IDCATEGORY = PRIOR TAXY.IDPARENTCATEGORY 

и хочу добавить к каждой записи CONTENTNAME столбца из таблицы CONTENT.

Я пробовал:

SELECT 
    CONNECT_BY_ROOT TCT.CONTENTNAME AS ENDNODECONTENTNAME 
    , TAXY.IDCATEGORY 
    , TAXY.IDPARENTCATEGORY 
    , TAXY.IDCONTENT 
    , TCT.CONTENTNAME 
    , TAXY.CATEGORYNAME 
    , LEVEL AS LVL 
FROM TAXONOMY TAXY 
LEFT OUTER JOIN CONTENT TCT ON TCT.IDCONTENT = TAXY.IDCONTENT 
CONNECT BY TAXY.IDCATEGORY = PRIOR TAXY.IDPARENTCATEGORY 

Ожидая те же результаты, только с CONNECT_BY_ROOT используя 1 дополнительный столбец: CONTENTNAME из CONTENT, связанного по IDCONTENT; который должен быть NULL, если нет соответствующего контента (IDCONTENT является NULL)

Вместо этого я получаю только строки, где IDCONTENT не NULL. Что я могу сделать, чтобы получить эти строки?

Я также попытался:

SELECT 
    CONNECT_BY_ROOT TAXY.IDCATEGORY AS IDBRANCH 
    , TAXY.IDCATEGORY 
    , TAXY.IDPARENTCATEGORY 
    , TAXY.IDCONTENT 
    , TCT.CONTENTNAME 
    , TAXY.CATEGORYNAME 
    , LEVEL AS LVL 
FROM TAXONOMY TAXY 
LEFT OUTER JOIN CONTENT TCT ON TCT.IDCONTENT = TAXY.IDCONTENT 
CONNECT BY TAXY.IDCATEGORY = PRIOR TAXY.IDPARENTCATEGORY 

И я также пытался

SELECT 
    SYS_CONNECT_BY_PATH(TAXY.CATEGORYNAME, ' \ ') AS BREADCRUMBSPATH 
    , TAXY.IDCATEGORY 
    , TAXY.IDPARENTCATEGORY 
    , TAXY.IDCONTENT 
    , TCT.CONTENTNAME 
    , TAXY.CATEGORYNAME 
    , LEVEL AS LVL 
FROM TAXONOMY TAXY 
LEFT OUTER JOIN CONTENT TCT ON TCT.IDCONTENT = TAXY.IDCONTENT 
START WITH TAXY.IDPARENTCATEGORY IS NULL CONNECT BY TAXY.IDPARENTCATEGORY = PRIOR TAXY.IDCATEGORY 

, но я получаю те же результаты (только значения, где IDCONTENT не является NULL)

В Самое странное в том, что вчера запрос работал над БД разработки, а теперь это не так. Поэтому я создал скрипку, чтобы проверить, могу ли я воспроизвести предыдущие результаты, и она отлично работает ... http://sqlfiddle.com/#!4/ecb9d/1http://sqlfiddle.com/#!4/ecb9d/3

Что могло вызвать эту смену поведения?

ответ

0

Я до сих пор не знаю, что произошло (до сих пор не работает), но это решение, кажется, работает хорошо в обоих случаях:

SELECT IDBRANCH, ENDNODEIDCONTENT, IDCATEGORY, IDPARENTCATEGORY, TAXYJ.IDCONTENT, TCT.CONTENTNAME AS ENDNODECONTENTNAME, CATEGORYNAME, LVL 
FROM (
    SELECT CONNECT_BY_ROOT TAXY.IDCATEGORY AS IDBRANCH 
    , CONNECT_BY_ROOT TAXY.IDCONTENT AS ENDNODEIDCONTENT 
    , TAXY.IDCATEGORY 
    , TAXY.IDPARENTCATEGORY 
    , TAXY.IDCONTENT 
    , TAXY.CATEGORYNAME 
    , LEVEL AS LVL 
FROM TAXONOMY TAXY 
CONNECT BY TAXY.IDCATEGORY = PRIOR TAXY.IDPARENTCATEGORY 
) TAXYJ 
LEFT OUTER JOIN CONTENT TCT ON TCT.IDCONTENT = TAXYJ.ENDNODEIDCONTENT 

http://sqlfiddle.com/#!4/ecb9d/4