【问题标题】:Include records that has a null value on INNER JOIN SQL Server query over a tree table包括在树表上的 INNER JOIN SQL Server 查询中具有空值的记录
【发布时间】:2015-08-03 07:06:13
【问题描述】:

我正在查询一个对自身具有嵌套引用的表,并且我需要获取对我正在使用的 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>

【问题讨论】:

    标签: sql-server sql-server-2008 join nested-table


    【解决方案1】:

    INNER JOIN 更改为LEFT 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)。


    .

    【讨论】:

    • 制作连续的 LEFT JOIN 帮助我解决了这个问题。非常感谢。
    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多