如何通過WITH遞歸計(jì)算層級(jí)關(guān)系

小樊
85
2024-09-21 15:03:44

在SQL中,可以使用WITH RECURSIVE語(yǔ)句遞歸地計(jì)算層級(jí)關(guān)系。下面是一個(gè)示例:

假設(shè)我們有一個(gè)如下的部門表(department),表示一個(gè)組織的層級(jí)結(jié)構(gòu):

CREATE TABLE department (
  id INT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  parent_id INT,
  FOREIGN KEY (parent_id) REFERENCES department(id)
);

其中,name字段表示部門的名稱,parent_id字段表示部門與其父部門之間的關(guān)系。如果部門沒有父部門,parent_id字段的值為NULL。

我們可以使用WITH RECURSIVE語(yǔ)句計(jì)算每個(gè)部門的層級(jí):

WITH RECURSIVE department_hierarchy AS (
  SELECT id, name, parent_id, 1 AS level
  FROM department
  WHERE parent_id IS NULL
  UNION ALL
  SELECT d.id, d.name, d.parent_id, dh.level + 1
  FROM department d
  JOIN department_hierarchy dh ON d.parent_id = dh.id
)
SELECT * FROM department_hierarchy;

在這個(gè)示例中,我們首先使用WITH子句定義了一個(gè)名為department_hierarchy的臨時(shí)表,用于存儲(chǔ)每個(gè)部門的層級(jí)信息。在這個(gè)臨時(shí)表中,我們選擇了id、name、parent_id字段,以及一個(gè)名為level的字段,表示部門的層級(jí)。

我們使用UNION ALL語(yǔ)句將兩個(gè)查詢結(jié)果合并在一起。第一個(gè)查詢結(jié)果包含了頂層部門(即parent_id為NULL的部門),以及它們的層級(jí)。第二個(gè)查詢結(jié)果通過將每個(gè)部門與其父部門連接起來(lái),計(jì)算每個(gè)部門的層級(jí)。

最后,我們從department_hierarchy臨時(shí)表中選擇所有記錄,得到每個(gè)部門的層級(jí)信息。

0