1

我正在查询一个对自身具有嵌套引用的表,并且我需要获取对我正在使用的 INNER JOIN 值有空引用的记录。换句话说,树表记录可能不会达到相同的深度,我需要全部获取。

我正在使用 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>

我读过我可以通过添加一个 OR 语句来扩展 INNER JOIN 条件,询问 bar.id_bar 是否为 NULL,但如果我这样做,我将无法达到更高的水平:

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>
4

1 回答 1

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 进行网络搜索(这里有一个可能的提示,您可以尝试适应您的情况)。


.

于 2015-05-21T14:32:03.887 回答