1

それ自体へのネストされた参照を持つテーブルに対してクエリを実行しています。使用している INNER JOIN 値に null 参照を持つレコードを取得する必要があります。つまり、ツリー テーブル レコードは同じ深さに達しない可能性があり、それらすべてを取得する必要があります。

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 かどうかを尋ねる OR ステートメントを追加することで INNER 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>
4

1 に答える 1

2

を に変更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>

LEFTbarN.id の深さに達するまで結合を続けることができますIS NULL。これは、 で最も深いレベルに達したことを意味しますN-1

しかし、階層を作成しようとしている場合、これはスケーラブルな方法ではありません。再帰的な CTE の Web 検索を実行します (状況に合わせて試すことができるヒントがここにあります)。


.

于 2015-05-21T14:32:03.887 に答える