【问题标题】:LEFT OUTER JOIN with CONNECT_BY_ROOT使用 CONNECT_BY_ROOT 的左外连接
【发布时间】:2015-01-14 11:44:28
【问题描述】:

我有

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

并希望从表 CONTENT 中添加到每个条目 CONTENTNAME 列。

我试过了:

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 from CONTENT,由 IDCONTENT 关联;如果没有关联内容,则应该是 NULLIDCONTENTNULL

相反,我只得到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

是什么导致了这种行为变化?

【问题讨论】:

    标签: sql oracle10g connect-by hierarchical-query


    【解决方案1】:

    我仍然不知道发生了什么(仍然无法正常工作),但这个解决方案似乎在这两种情况下都可以正常工作:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      相关资源
      最近更新 更多