with使った再帰結合

今更ながらまともに長いSQLを久しぶりに見たので、結合周り再入門的な。

WITH
     lavels(id, name, level, path) AS
     (SELECT categories.id, categories.name, 1, CONVERT(varchar(255),categories.name)
         FROM categories
         WHERE categories.parent_id = 0
      UNION ALL
      SELECT categories.id, categories.name, parent.level + 1,
             CONVERT(varchar(255),parent.path + ' > ' + categories.name)
         FROM categories
             INNER JOIN lavels parent
                 ON categories.parent_id = parent.id
         WHERE categories.deleted_flag = 0 AND categories.display_order <> 0
     )
         
select *
from lavels

[categoriesテーブル]

id name parent_id
1 大カテゴリ1 0
2 大カテゴリ2 0
3 中カテゴリ1 1
4 中カテゴリ2 2
5 小カテゴリ1 4

結果

id name level item_path
1 大カテゴリ1 1 大カテゴリ1
2 大カテゴリ2 1 大カテゴリ2
3 中カテゴリ1 2 大カテゴリ1 > 中カテゴリ1
4 中カテゴリ2 2 大カテゴリ2 > 中カテゴリ2
5 小カテゴリ1 3 大カテゴリ2 > 中カテゴリ2 > 小カテゴリ1

最初これでlevelとitem_pathが増えてってるのが不思議だった。
けどunion後半でlavelsの行どんどん増えてって、それ見て結合してるんだからそりゃ増えてくよね、と。
今までシンプルなSQLで何とかなっちゃっていたので再入門。
確かに一番最初SQLやったときにこんなの色々やった覚えある。