2015-05-21 34 views
1

我查詢了一個嵌套對自身的引用的表,並且我需要獲取INNER JOIN值上的空引用的記錄我在用着。換句話說,樹表記錄可能達不到相同的深度,我需要將它們全部取出。包含INNER JOIN上的空值的記錄樹表上的SQL Server查詢

我使用ATM查詢是:

SELECT DISTINCT <valuesThatINeed> 
FROM atable foo 
    INNER JOIN treetable bar ON foo.id_bar = bar.id 
    INNER JOIN treetable bar2 ON bar.id_bar = bar2.id 
    INNER JOIN treetable bar3 ON bar2.id_bar = bar3.id 
WHERE 
    <constraints> 

我讀過,我可以延長內通過添加或聲明,詢問是否bar.id_bar IS NULL JOIN條件,但我不能再達到水平如果我這樣做:

SELECT DISTINCT <valuesThatINeed> 
FROM atable foo 
    INNER JOIN treetable bar ON foo.id_bar = bar.id 
    INNER JOIN treetable bar2 ON bar.id_bar = bar2.id OR (bar.id_bar IS NULL) 
    INNER JOIN treetable bar3 ON bar2.id_bar = bar3.id 
WHERE 
    <constraints> 

回答

2

更改INNER JOINLEFT JOIN

SELECT DISTINCT <valuesThatINeed> 
, CASE 
    WHEN barN.id IS NULL 
     THEN 'Your previous level with BarID = ' 
       + CAST(barN-1.id AS NVARCHAR(MAX)) 
       + ' is the deepest level' 
     ELSE '' 
    END 
FROM atable foo 
    LEFT JOIN treetable bar ON foo.id_bar = bar.id 
    LEFT JOIN treetable bar2 ON bar.id_bar = bar2.id OR (bar.id_bar IS NULL) 
    LEFT JOIN treetable bar3 ON bar2.id_bar = bar3.id 
    ... 
    LEFT JOIN treetable barN ON barN-1.id_bar = barN.id 
WHERE 
    <constraints> 

您可以繼續製作LEFT連接,直至達到您的barN.id IS NULL的深度,這意味着您已達到N-1的最深層次。

但是,如果您嘗試創建層次結構,那麼這不是可擴展的方式。對遞歸CTE進行網絡搜索(here is a possible hint which you can try to adapt to your situation)。


+0

進行連續的左連接幫助我解決了這個問題。非常感謝。 – lerp90