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
- iOS實現依賴注入iOS依賴注入
- Oracle 查詢鎖之間的依賴關係Oracle
- PHP 依賴注入容器實現PHP依賴注入
- 依賴注入實現元件化依賴注入元件化
- mysql根據節點查詢所有葉節點MySql
- 使用SQL實現特殊查詢(1)SQL
- WPF/C#:在WPF中如何實現依賴注入C#依賴注入
- SQL Server 2005實現資料庫快取依賴SQLServer資料庫快取
- go語言依賴注入實現Go依賴注入
- JavaScript依賴注入的實現思路JavaScript依賴注入
- mysql多表查詢如何實現MySql
- Oracle中查詢依賴的無效物件(invalid object)Oracle物件Object
- 查詢依賴關係的objects 是否有被DDL過Object
- js用字首名查詢class或id節點,js模糊查詢某個dom節點JS
- Maven 原始碼解析:依賴調解是如何實現的?Maven原始碼
- 如何發現Python依賴庫漏洞Python
- 如何用最簡單的方式解釋依賴注入?依賴注入是如何實現解耦的?(通俗易懂)依賴注入解耦
- 動手實現你的依賴注入依賴注入
- 用 Dagger 2 實現依賴注入依賴注入
- Guice指南-用Guice實現依賴注入GUI依賴注入
- 如何實現查詢介面的所有實現類
- SQL多個表實現聯合查詢SQL
- Sql Server 使用CTE實現遞迴查詢SQLServer遞迴
- SQL Server 2005 實現資料庫快取依賴的實現步驟整理SQLServer資料庫快取
- MaxCompute如何對SQL查詢結果實現分頁獲取SQL
- Oracle總結【SQL細節、多表查詢、分組查詢、分頁】OracleSQL
- sql查詢學習和實踐點滴積累SQL
- MySQL遞迴查詢樹狀表的子節點、父節點MySql遞迴
- SQL Server2005 實現資料庫快取依賴的實現步驟整理SQLServer資料庫快取
- Laravel 中的依賴注入和 IoC 實現Laravel依賴注入
- 使用 .NET Core 實現依賴關係注入
- 關於Golang中的依賴注入實現Golang依賴注入
- Go中使用Google Wire實現依賴注入Go依賴注入
- ASP.NET WebApi + Autofac 實現依賴注入ASP.NETWebAPI依賴注入
- ASP.NET的快取依賴機制-SQL快取依賴篇ASP.NET快取SQL