SQL如何實現查詢節點依賴
SQL如何運用遞迴查詢有向無環圖的節點依賴呢?
問題是這樣的
例如我有以上的兩個圖,節點b
的前置節點是a
,節點c
的前置節點是b
和d
,以此類推。給出一個節點,需要找出以此節點為前置節點的所有鏈條節點。比如給出a
,那出來的結果就是a,b,c,d,e
,給出f
,那出來的結果就是f,g,h,i,j,k
。
資料準備
建立表以及插入資料,多個前置節點用,
隔開,注意,使用的是PostgreSQL資料庫。
-- ----------------------------
-- Table structure for mytest
-- ----------------------------
DROP TABLE IF EXISTS "public"."mytest";
CREATE TABLE "public"."mytest" (
"node" varchar(256) COLLATE "default",
"pre_nodes" varchar(10240) COLLATE "default"
);
-- ----------------------------
-- Records of mytest
-- ----------------------------
INSERT INTO "public"."mytest" VALUES ('a', null);
INSERT INTO "public"."mytest" VALUES ('b', 'a');
INSERT INTO "public"."mytest" VALUES ('c', 'b,d');
INSERT INTO "public"."mytest" VALUES ('d', 'b');
INSERT INTO "public"."mytest" VALUES ('e', 'c');
INSERT INTO "public"."mytest" VALUES ('f', null);
INSERT INTO "public"."mytest" VALUES ('g', 'f');
INSERT INTO "public"."mytest" VALUES ('h', 'g');
INSERT INTO "public"."mytest" VALUES ('i', 'g');
INSERT INTO "public"."mytest" VALUES ('j', 'g');
INSERT INTO "public"."mytest" VALUES ('k', 'h,i,j');
SQL建立
方法有多種,用函式或者儲存過程也可以,這裡使用WITH
遞迴,相關資訊可以百度:postgresql 遞迴
。第一個select
語句中要給出起始節點。
WITH RECURSIVE graph_depds AS (
SELECT node,pre_nodes FROM mytest a WHERE node = 'f'
UNION ALL
SELECT a.node,a.pre_nodes FROM mytest a, graph_depds b WHERE strpos(a.pre_nodes, b.node) > 0
)
SELECT DISTINCT node,pre_nodes FROM graph_depds ORDER BY node;
如果想向前
查詢呢
上面的查詢相當於找出一個節點所有影響
到的節點,其實就是向下遞迴,如果給出一個節點,想從這個節點往前追溯有關的節點呢?例如給出c
節點,結果是a,b,c,d
,其實就是向上遞迴,可以像下面這樣寫。
WITH RECURSIVE graph_depds AS (
SELECT node,pre_nodes FROM mytest a WHERE node = 'i'
UNION ALL
SELECT a.node,a.pre_nodes FROM mytest a, graph_depds b WHERE strpos(b.pre_nodes,a.node) > 0
)
SELECT DISTINCT node,pre_nodes FROM graph_depds ORDER BY node;
其他資料庫
如果像Sql Server
等支援WITH
語法的資料,以上寫法可以移植,稍作修改就好。但是mysql
等資料庫中的實現方式不一樣,百度mysql 遞迴相關的內容都能找到方法。
相關文章
- 依賴注入?依賴注入是如何實現解耦的?依賴注入解耦
- 透過遞迴查詢應用依賴遞迴
- MySQL實現樹狀所有子節點查詢的方法MySql
- mysql根據節點查詢所有葉節點MySql
- PHP 依賴注入容器實現PHP依賴注入
- 依賴注入實現元件化依賴注入元件化
- MaxCompute如何對SQL查詢結果實現分頁獲取SQL
- mysql多表查詢如何實現MySql
- WPF/C#:在WPF中如何實現依賴注入C#依賴注入
- 如何發現Python依賴庫漏洞Python
- Oracle總結【SQL細節、多表查詢、分組查詢、分頁】OracleSQL
- js用字首名查詢class或id節點,js模糊查詢某個dom節點JS
- go語言依賴注入實現Go依賴注入
- Maven 原始碼解析:依賴調解是如何實現的?Maven原始碼
- 如何用最簡單的方式解釋依賴注入?依賴注入是如何實現解耦的?(通俗易懂)依賴注入解耦
- MongoDB 如何支援類 SQL 查詢MongoDBSQL
- pnpm 管理依賴包是如何節省磁碟空間的?NPM
- 比nestjs更優雅的ts控制反轉策略-依賴查詢JS
- 分散式資料庫下子查詢和 Join 等複雜 SQL 如何實現?分散式資料庫SQL
- 如何實現引數級聯查詢
- 如何實現模糊查詢時間段
- Java 中如何使用 SQL 查詢 TXTJavaSQL
- sql查詢是如何執行的?SQL
- SQL查詢的:子查詢和多表查詢SQL
- ASP.NET WebApi + Autofac 實現依賴注入ASP.NETWebAPI依賴注入
- Go中使用Google Wire實現依賴注入Go依賴注入
- 關於Golang中的依賴注入實現Golang依賴注入
- Laravel 中的依賴注入和 IoC 實現Laravel依賴注入
- 用trait實現簡單的依賴注入AI依賴注入
- Maven什麼時候需要排除依賴,如何排除依賴Maven
- 編寫一個 SQL 查詢來實現分數排名。SQL
- 淺析如何通過PHP類的反射來實現依賴注入PHP反射依賴注入
- SQL Sever 實現查詢超過自己經理工資的員工(自連線查詢)SQL
- DIY 實現 ThinkPHP 核心框架 (十四)利用反射實現依賴注入PHP框架反射依賴注入
- 資料庫——查詢樹形結構某節點的所有子節點、所有父節點資料庫
- Spring學習:簡單實現一個依賴注入和迴圈依賴的解決Spring依賴注入
- SQL--查詢SQL
- SQL 聚合查詢SQL