PostgreSQL 務實應用(一/5)樹形層級

来源:https://www.cnblogs.com/timeddd/archive/2019/05/13/10855319.html
-Advertisement-
Play Games

項目中,經常會碰到多級的樹形結構數據,如地區信息,省、市、區、街道等,或客戶關係信息上三級,下三級等。 實際項目中,我們可能碰到以下兩種需求: 一條記錄中呈現路徑:省 市 區 街道 一條記錄中呈現上幾級:上級,上上級,上上上級 此情此景,使用 WITH RECURSIVE 遞歸查詢再合適不過。 遞歸 ...


項目中,經常會碰到多級的樹形結構數據,如地區信息,省、市、區、街道等,或客戶關係信息上三級,下三級等。

實際項目中,我們可能碰到以下兩種需求:

  • 一條記錄中呈現路徑:省 - 市 - 區 - 街道
  • 一條記錄中呈現上幾級:上級,上上級,上上上級

此情此景,使用 WITH RECURSIVE 遞歸查詢再合適不過。

遞歸查詢

在介紹 WITH RECURSIVE 之前,我們先介紹一個 WITH

通過 WITH ,我們可以在寫查詢語句之前,為一個需要用到的子查詢定義一個臨時的別名,該別名可以查詢語句中使用,從而簡化查詢語句。如下示例:

WITH 臨時別名 AS(
    SELECT 1 a, 2 b, 3 c  
)
-- 下邊是查詢語句,像使用表或視圖一樣使用了“臨時別名”
select a * a, b * b, c * c from 臨時別名;

接下來我們再來看遞歸 RECURSIVE ,我們知道,遞歸形式上就是自己會調用自己,對於數據集而言,遞歸通常需要兩個條件:

  1. 有入口數據,即遞歸開始的數據記錄
  2. 有遞歸結束的條件,即在關聯自己的同時有終止的條件

這第 2 點,原因很簡單,關聯自己產生的新數據記錄又會成為遞歸關聯中的數據。通常 WHERE 子句給出這個條件。

PostgreSQL 中,WITH RECURSIVE 即表示遞歸查詢,“臨時別名”在定義自身的子查詢體中也可以使用。

我們來看一個示例:

-- 定義了一個臨時別名 cet
WITH RECURSIVE cet AS (
  -- 遞歸初始的數據,id=1, name="name 1", pid=null (最頂層父id為空) 
  SELECT 1 AS id, 'name 1' AS name, cast(null AS int) AS pid
  UNION ALL
  -- 聯合 cet 自己,id 遞增,結束條件為 id < 10。如果不加這個 WHERE 會如何?
  SELECT id+1, 'name ' || (id+1), id FROM cet WHERE id < 10
)
SELECT * FROM cet;

輸出以下結果:

搞定需求

上邊的示例中的結果集就是一個典型的樹形層級結構,我們以這個數據結果為例來完成文章開頭提到的兩個需求,首先我們把這個結果集變成一個視圖以便當源數據用。

-- 創建一個名字為 view_tree_test 的視圖
CREATE VIEW view_tree_test as
WITH RECURSIVE cet AS (
    SELECT 1 AS id, 'name 1' AS name, cast(null AS int) AS pid
  UNION ALL
    SELECT id+1, 'name ' || (id+1), id FROM cet WHERE id < 10
)
SELECT * FROM cet;

我們以 view_tree_test 作為數據源來完成兩大需求。

需求一,顯示路徑

WITH RECURSIVE tpath AS(
    SELECT id, name, pid, name as path from view_tree_test where pid is null
    UNION ALL
    -- 聯合子節點
    SELECT a.id, a.name, a.pid, 
           tpath.path || '-' || a.name  -- 父路徑拼接當前節點名稱形成路徑
      FROM view_tree_test a, tpath      -- 關聯已有結果,查詢其子節點
     WHERE a.pid = tpath.id
) 
SELECT * FROM tpath;

查詢結果可見其效果:

需求二,顯示每第記錄的上三級

WITH RECURSIVE uuup AS(
    -- 初始值,頂層的上級均置為空,需要幾級置幾個空
    SELECT id, name, '' 上級, '' 上上級, '' 上上上級 from view_tree_test where pid is null
    UNION ALL
    -- 聯合子節點
    SELECT a.id, a.name, 
           -- 父級即為上級,父的上級為上上級
           uuup.name 上級, uuup.上級 上上級, uuup.上上級 上上上級
      FROM view_tree_test a, uuup      -- 關聯已有結果,查詢其子節點
     WHERE a.pid = uuup.id
) 
SELECT * FROM uuup;

順利呈現相關的上三級,需要更多上級也是 SO EASY!

小結

PostgreSQL 提供了相當多實用的數據處理方式,讓數據處理起來很是便捷。樹形結構是應用中經常會使用到,使用遞歸查詢能方便的處理跨層級的計算,還有很多想象空間哦。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Rman常用命令 Preview選項 1) 顯示用於還原system表空間數據文件的備份文件 RMAN> restore datafile 2 preview; 2) 顯示用於還原特定的表空間的備份文件; RMAN> restore tablespace users preview; 3) 顯示執行 ...
  • 文章大綱 一、搜索引擎框架基礎介紹二、ElasticSearch的簡介三、ElasticSearch安裝(Windows版本)四、ElasticSearch操作客戶端工具--Kibana五、ES的常用命令六、Java連接ElasticSearch進行數據操作七、項目源碼與參考資料下載八、參考文章 一 ...
  • 最近Oracle資料庫總是出問題,於是卸載乾凈後重新安裝,安裝過程中遇到了一些問題於是百度解決,在這裡記錄下來方便以後查看。 win10系統安裝oracle11g時遇到INS-13001環境不滿足最低要求 在安裝時點擊setup.exe之後,出現了:[INS-13001]環境不滿足最低要求 這時,打 ...
  • 1.大數據與機器學習的關係: 大數據領域我們做的是數據的存儲和簡單的統計計算,機器學習在大數據的應用是為了發現數據的規律或模型,用機器學習演算法對數據進行計算的到的模型,從而決定我們的預測與決定的因素(比如在大數據用戶畫像項目里,生成的特殊用戶欄位)。 2.大數據在機器學習的應用 目前市場實際開發模式 ...
  • 前言 人生在於折騰系列,網路,多線程等系列博客樓主還在繼續折騰也不會放棄。這是全新的系列,緩存的知識其實並不僅僅在於簡單的增刪改查,我覺得有必要全面深入的學習一波。記錄學習的過程與體悟。 RDB 什麼是RDB 對redis中的數據執行周期性的持久化,通過配置文件中設置檢查間隔時間與備份觸發條件來對數 ...
  • Microsoft SQL Server SQL Server 是Microsoft 公司推出的關係型資料庫管理系統。具有使用方便可伸縮性好與相關軟體集成程度高等優點,可跨越膝上型電腦到運行Microsoft Windows Server的大型多處理器的伺服器等多種平臺使用。 Microsoft S ...
  • 恢復內容開始 Redis集群設計包括2部分:哈希Slot和節點主從,本篇博文通過3張圖來搞明白Redis的集群設計。 節點主從: 主從設計不算什麼新鮮玩意,在資料庫中我們也經常用主從來做讀寫分離,直接上圖: 圖上能看得到的信息: 1, 只有1個Master,可以有N個slaver,而且Slaver也 ...
  • 一、搜索引擎基礎介紹二、常見搜索引擎框架介紹與比較三、參考文章 一、搜索引擎基礎介紹 1. 什麼是搜索引擎 搜索引擎,通常指的是收集了萬維網上幾千萬到幾十億個網頁並對網頁中的每一個詞(即關鍵詞)進行索引,建立索引資料庫的全文搜索引擎。當用戶查找某個關鍵詞的時候,所有在頁面內容中包含了該關鍵詞的網頁都 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...