精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

實戰SQL:地鐵換乘線路圖查詢

數據庫 SQL Server
對于很多 IT 從業人員來說,SQL 僅僅意味著簡單的增刪改查(SELECT、INSERT、UPDATE 和 DELETE),但實際上 SQL 能夠實現的功能遠遠不止簡單的增刪改查。

對于很多 IT 從業人員來說,SQL 僅僅意味著簡單的增刪改查(SELECT、INSERT、UPDATE 和 DELETE),但實際上 SQL 能夠實現的功能遠遠不止簡單的增刪改查。

今天我們就來介紹一個高級 SQL 功能:通用表表達式(Common Table Expression)。CTE 可以提高復雜查詢的性能和可讀性,實現樹狀結構或者圖數據的遍歷,實現以下功能:

  • 生成數字序列;
  • 獲取員工上下級的組織關系;
  • 查詢地鐵、航班換乘線路;
  • 社交網絡圖譜分析。

一般來說,我們只能通過應用程序或者存儲過程實現這些復雜的功能。但是有了 CTE,我們可以直接利用一個 SQL 語句完成以上功能。CTE 不僅強大而且通用,各種主流數據庫都提供了支持。

我們通過幾個實用案例,了解一下 CTE 的語法,同時介紹各種數據庫中的實現差異。

簡單 CTE

通用表表達式使用 WITH 關鍵字表示,例如:

WITH t(n) AS (
  SELECT 4
)
SELECT * FROM t;
n|
-|
4|

以上 WITH 子句相當于定義了一個語句級別的臨時表 t(n),在隨后的 SELECT、INSERT、UPDATE 以及 DELETE 語句中都可以使用。

WITH 子句定義了一個表達式,表達式的值是一個表,所以稱為通用表表達式。CTE 和子查詢類似,可以用于 SELECT、INSERT、UPDATE 以及 DELETE 語句。Oracle 中稱之為子查詢因子(subquery factoring)

CTE 與子查詢類似,只在當前語句中有效;不過一個語句中可以定義多個 CTE,而且 CTE 被定義之后可以多次引用:

WITH t1(n) AS (
  SELECT 4 -- FROM dual
),
t2(n) AS (
  SELECT n+1 FROM t1
)
SELECT t1.n, t2.n
  FROM t1 
 CROSS JOIN t2;
n|n|
-|-|
4|5|

第一個 CTE 名為 t1;第二個 CTE 名為 t2,引用了前面定義的 t1 ;每個 CTE 之間使用逗號進行分隔;最后的 SELECT 語句使用前面定義的 2 個 CTE 進行連接查詢。這種使用 CTE 的方法和編程語言中的變量非常類似。

CTE 和視圖、臨時表或者子查詢都有點類似,但是比它們的結構更加清晰;數據庫對于 CTE 只需要執行一次,性能也會更好。不過,CTE 真正強大之處是允許在定義中調用自己,也就是遞歸調用。

生成數字序列

WITH 子句還有一種遞歸形式,以下語句可以生成一個 1 到 10 的數字序列:

WITH RECURSIVE t(n) AS
(
  SELECT 1 -- 初始化
   UNION ALL
  SELECT n + 1 FROM t WHERE n < 10 -- 遞歸結束條件
)
SELECT n FROM t;
n |
--|
 1|
 2|
 3|
 4|
 5|
 6|
 7|
 8|
 9|
10|

其中,RECURSIVE 表示遞歸查詢,Oracle 和 SQL Server 中不需要該關鍵字。

遞歸 CTE 包含兩部分,UNION ALL 上面的查詢語句用于生成初始化數據;下面的查詢語句用于遞歸,引用了它自身( t )。

  • 運行初始化語句,生成數字 1;
  • 第 1 次運行遞歸部分,此時 n 等于 1,返回數字 2( n+1 );
  • 第 2 次運行遞歸部分,此時 n 等于 2,返回數字 3( n+1 );
  • 第 9 次運行遞歸部分,此時 n 等于 9,返回數字 10( n+1 );
  • 第 10 次運行遞歸部分,此時 n 等于 10;由于查詢不滿足條件( WHERE n < 10 ),不返回任何結果,并且遞歸結束;最后的查詢語句返回 t 中的全部數據,也就是一個 1 到 10 的數字序列。

只要是具有一定規律的數字序列都可以通過遞歸 CTE 生成,例如斐波那契數列。

遍歷組織結構圖

在公司的組織結構中,存在上下級的管理關系,如下圖所示。

示例表和數據:https://github.com/dongxuyang1985/thinking_in_sql

如果我們想要知道某個員工從上至下的各級領導,可以使用遞歸 CTE:

WITH RECURSIVE employee_path (emp_id, emp_name, path) AS
(
  SELECT emp_id, emp_name, CAST(emp_name AS CHAR(100)) AS path
    FROM employee
   WHERE manager IS NULL
   UNION ALL
  SELECT e.emp_id, e.emp_name, CAST(CONCAT(ep.path, '->', e.emp_name) AS CHAR(1000))
    FROM employee_path ep
    JOIN employee e ON ep.emp_id = e.manager
)
SELECT * FROM employee_path WHERE emp_name = '黃忠';
emp_id|emp_name|path             |
------|--------|-----------------|
     5|黃忠    |劉備->諸葛亮->黃忠|

上面是 MySQL 中的語法。

Oracle 以及 SQL Server 中需要將 CHAR(100) 改為 VARCHAR(100),同時省略 RECURSIVE 關鍵字;PostgreSQL 中需要將 CAST 函數里的 CHAR(100) 改為 VARCHAR(100);SQLite 沒有提供 CONCAT 函數,使用連接操作符(||)即可。

其中,初始化查詢用于查找沒有 manager 的員工,也就是最上級的領導;遞歸查詢通過將員工的 manager 和上級員工的 emp_id 進行關聯,獲取上下級管理關系;遞歸結束的條件就是沒有找到任何數據。當然,我們也可以從下級往上級進行遍歷。

其他具有這種層級關系的數據包括多層菜單、博客文章中的評論等。

查找地鐵換乘線路

地鐵、公交、航班等,包括社交網站上的關注,都是一種有向圖數據結構。我們通常需要查找某一站點到另一站點的最短路徑,利用遞歸 CTE 可以實現這類需求。

示例表和數據:https://github.com/dongxuyang1985/sql_in_action

以下語句用于查找“王府井”到“積水潭”的換乘路線,使用 PostgreSQL 數據庫實現:

WITH RECURSIVE paths (start_station, stop_station, stops, path) AS (
  SELECT station_name, next_station, 1, ARRAY[station_name::text, next_station::text]
    FROM bj_subway WHERE station_name = '王府井'
   UNION ALL
  SELECT p.start_station, e.next_station, stops + 1, p.path || ARRAY[e.next_station::text]
    FROM paths p
    JOIN bj_subway e
      ON p.stop_station = e.station_name AND NOT e.next_station = ANY(p.path)
)
SELECT * FROM paths WHERE stop_station = '積水潭';
start_station|stop_station|stops|path                                                                           |
-------------|------------|-----|-------------------------------------------------------------------------------|
王府井        |積水潭      |    8|{王府井,天安門東,天安門西,西單,復興門,阜成門,車公莊,西直門,積水潭}                                         |
王府井        |積水潭      |    9|{王府井,東單,建國門,朝陽門,東四十條,東直門,雍和宮,安定門,鼓樓大街,積水潭}                                     |
王府井        |積水潭      |   13|{王府井,東單,建國門,北京站,崇文門,前門,和平門,宣武門,長椿街,復興門,阜成門,車公莊,西直門,積水潭}                        |
王府井        |積水潭      |   18|{王府井,天安門東,天安門西,西單,復興門,長椿街,宣武門,和平門,前門,崇文門,北京站,建國門,朝陽門,東四十條,東直門,雍和宮,安定門,鼓樓大街,積水潭}|

查詢結果顯示有 4 條路線,如果選擇最短路線就是第一條。其中的 path 字段是個數組,用于存儲走過的站點;最后的 NOT e.next_station = ANY(p.path) 條件用于避免反復經過同一個站點,因為地鐵線路是一個雙向圖。

我們還可以進一步計算換乘次數,實現最少換乘路線;如果在表中增加一些字段,記錄每兩個站點之間的時間和換乘時間,還可以計算最快路線。

其他數據庫沒有提供數組類型,但是可以使用其他方法實現,以下是 MySQL 中的實現:

WITH RECURSIVE paths (start_station, stop_station, stops, path) AS (
  SELECT station_name, next_station, 1, CAST(CONCAT(station_name , ',', next_station) AS CHAR(1000))
    FROM bj_subway WHERE station_name = '王府井'
   UNION ALL
  SELECT p.start_station, e.next_station, stops + 1, CONCAT_WS(',', p.path, e.next_station)
    FROM paths p
    JOIN bj_subway e
      ON p.stop_station = e.station_name AND (INSTR(p.path, e.next_station) = 0)
)
SELECT * FROM paths WHERE stop_station ='積水潭';

我們使用了逗號分隔符的字符串模擬數組的效果,這種方法也適用于其他數據庫。

責任編輯:華軒 來源: SQL編程思想
相關推薦

2012-12-29 16:38:41

搜狗地圖

2020-09-17 17:46:20

Python地鐵線路圖

2010-05-11 09:22:00

Unix系統

2012-02-20 09:20:34

蘋果iOS應用開發

2016-10-19 09:17:15

HTML5Javascript可視化

2012-02-02 14:55:27

微軟System CentSQL Server

2009-03-11 09:08:29

LotusLotusLiveIBM

2015-02-02 16:14:06

微軟Cloud Platf線路圖

2018-03-26 09:19:44

JavaScript開發 特性

2012-09-18 10:11:45

Intel5nm線路圖

2019-04-28 12:00:56

地鐵數據代碼

2020-12-19 21:03:20

騰訊云開發者Techo Park

2016-07-11 15:55:18

大數據

2012-08-13 14:17:35

算法代碼

2015-06-25 17:26:52

京港地鐵華為

2015-02-03 14:50:37

2012-07-19 10:34:08

3G電信北京地鐵

2012-12-10 11:29:21

瀏覽器搜狗

2016-01-27 14:47:02

云監控華為

2016-06-08 14:47:17

高德
點贊
收藏

51CTO技術棧公眾號

久久亚洲综合色一区二区三区| 成人开心激情| 国产成都精品91一区二区三| 97视频免费观看| 91无套直看片红桃在线观看| 精品女同一区二区三区在线观看| 91美女片黄在线| 国产精品日韩一区| 国产网站在线看| 色喇叭免费久久综合| 精品国产一区二区三区忘忧草| 亚洲视频精品一区| 国产成人自拍一区| 激情五月激情综合网| 久久久久久久97| 亚洲色图日韩精品| 免费萌白酱国产一区二区三区| 亚洲国产日韩a在线播放| 欧美性天天影院| 亚洲高清精品视频| 久久国产视频网| 欧美一乱一性一交一视频| 欧美黄色aaa| 欧美日韩精品一区二区视频| 日韩av在线网| 精品无码av一区二区三区| 日韩一区二区三免费高清在线观看| 国产精品天天看| 精品国产免费久久久久久尖叫| 国产精品第九页| 999久久久91| 亚洲色图13p| 久久久久成人精品无码中文字幕| 天堂中文av在线资源库| 亚洲乱码国产乱码精品精可以看| 国产99在线播放| 狠狠色伊人亚洲综合网站色| www.激情网| 日本最黄一级片免费在线| 久久亚区不卡日本| 精品欧美日韩在线| 欧美一级在线免费观看| 福利一区二区在线| 波多野结衣一区二区三区在线观看| 九九在线观看视频| 久久久国产精品| 精品国偷自产在线| 最新黄色av网址| 色天天综合网| 最新亚洲国产精品| 手机免费观看av| 波多野结衣在线观看一区二区三区 | 欧美午夜aaaaaa免费视频| 福利影院在线看| 亚洲va韩国va欧美va| 一卡二卡三卡视频| 久久男人av资源站| 狠狠色噜噜狠狠狠狠97| 777久久久精品一区二区三区| 青青影院在线观看| 中文字幕日韩精品一区| 永久域名在线精品| 18+激情视频在线| 亚洲国产日韩a在线播放性色| 亚洲美女网站18| 日本在线视频网| 亚洲欧美电影一区二区| 男人天堂成人网| 欧美激情成人动漫| 欧美日韩另类在线| 91制片厂毛片| 日韩精品一区国产| 亚洲精品99999| 天天躁日日躁aaaxxⅹ| 国产精品欧美在线观看| 神马国产精品影院av| 欧美日韩免费做爰视频| 99成人在线| 国产精品高精视频免费| 亚洲在线免费观看视频| 国产成人av影院| 免费电影一区| 麻豆tv入口在线看| 亚洲777理论| 九九视频精品在线观看| 精品国产三区在线| 日韩精品一级中文字幕精品视频免费观看 | 成人性生活免费看| 天海翼亚洲一区二区三区| 一区二区三欧美| 182在线观看视频| 一本色道精品久久一区二区三区| 成年无码av片在线| 在线观看中文字幕视频| 蜜桃av噜噜一区| 91成人免费观看| 日韩一区av| 亚洲免费在线播放| 欧美视频第一区| 成人亚洲精品| 亚洲视频在线看| 久久国产精品二区| 蜜桃视频一区二区三区| 国产精品视频入口| 日本福利在线| 日韩欧美aaa| 亚欧精品在线视频| 凹凸成人精品亚洲精品密奴| 97精品国产97久久久久久| 又污又黄的网站| 97久久超碰精品国产| 在线观看视频黄色| 精品欧美一区二区三区在线观看| 在线中文字幕一区二区| 久久久久国产免费| 久久在线视频免费观看| 日本欧美在线视频| 成人av一区二区三区在线观看| 成人一区二区在线观看| 亚洲一区精品视频| 无人区在线高清完整免费版 一区二| 91国产精品成人| 欧美极品jizzhd欧美仙踪林| 欧美成人激情| 国产精品99久久久久久www| 精品人妻一区二区三区含羞草| 丁香五精品蜜臀久久久久99网站 | 久久久噜噜噜久久中文字免| 国产偷人爽久久久久久老妇app| 麻豆精品在线观看| 欧洲在线视频一区| 国产高清自产拍av在线| 欧美videos大乳护士334| 午夜国产小视频| 久久99精品久久久久| 亚洲电影一二三区| 日本.亚洲电影| 在线观看不卡av| 精品黑人一区二区三区| 91美女片黄在线| 日本xxxxxxx免费视频| 欧美a级网站| 欧美亚洲另类制服自拍| 外国精品视频在线观看 | 欧美日韩人妻精品一区二区三区| 影音先锋久久精品| caoporen国产精品| 青青在线视频| 日韩一区二区麻豆国产| 日韩a级片在线观看| 韩国一区二区三区| 韩国黄色一级大片| 精品中文在线| 欧美激情一区二区三区高清视频| 亚洲婷婷综合网| 26uuu另类欧美| 国产熟女高潮视频| 精品九九在线| 成人网在线免费看| 亚洲精品白浆| 日韩av一区二区在线观看| 亚洲日本韩国在线| 青青青青在线| 国产精品无圣光一区二区| 国产区二区三区| 亚洲乱码免费伦视频| 不卡一卡2卡3卡4卡精品在| 最近高清中文在线字幕在线观看| 亚洲国产精品久久久久婷婷884| 免费在线观看亚洲视频| 国产精品一级在线观看| 色综合视频一区中文字幕| 免费国产黄色片| 色综合天天综合给合国产| 国产探花视频在线播放| 精品一二三四在线| 日韩欧美猛交xxxxx无码| 免费看成人吃奶视频在线| 国产日韩专区在线| 国产一线二线在线观看| 亚洲欧美国产高清va在线播| 一级黄色免费片| 亚洲成在人线在线播放| 69视频在线观看免费| 国产成人综合网站| 37pao成人国产永久免费视频| www.亚洲一二| 国产精品福利网站| 在线中文字幕视频观看| 亚洲男人天堂久| 国产suv精品一区二区69| 欧美视频免费在线观看| 欧美日韩午夜视频| 91在线免费视频观看| 蜜臀一区二区三区精品免费视频| 青青草97国产精品麻豆| wwwxx欧美| 精品欧美日韩精品| 久久久久久久成人| h网站在线免费观看| 亚洲国产91精品在线观看| 最近中文字幕在线视频| 午夜精品久久一牛影视| 成人性视频免费看| 久久免费电影网| 日本美女视频网站| 久久er精品视频| 亚洲人成无码www久久久| 欧美福利影院| 在线观看欧美一区| 国产伦一区二区三区| 成人综合色站| 国产成人视屏| 国产精品精品一区二区三区午夜版 | 日韩黄色a级片| 亚洲精品国产a| 日本女人性生活视频| 久久综合成人精品亚洲另类欧美| 欧美视频免费看欧美视频| 99久久婷婷| 色大师av一区二区三区| 美女毛片一区二区三区四区最新中文字幕亚洲| 亚洲专区中文字幕| 91精品国产自产观看在线| 国产精品久久激情| 伊人久久精品一区二区三区| 国色天香2019中文字幕在线观看| 亚洲aaa在线观看| 精品日韩99亚洲| xxxwww在线观看| 777亚洲妇女| 一级黄色片免费看| 欧美色涩在线第一页| 亚洲高清在线看| 91国产免费看| 波多野结衣日韩| 色综合久久中文字幕| 西西44rtwww国产精品| 性感美女久久精品| 天天插天天操天天干| 午夜精品福利一区二区三区av | 亚洲欧美日韩一区| 91免费公开视频| 亚洲天堂av一区| 中文字幕在线有码| 亚洲欧美成人一区二区三区| 免费成年人视频在线观看| 1024精品合集| 国产黄在线免费观看| 亚洲精品欧美专区| 国产亚洲精品久久久久久无几年桃| 久久精品一区四区| 中文字幕在线1| 欧美极品xxx| 少妇视频一区二区| 亚洲精品免费视频| 欧美xxxx黑人xyx性爽| 亚洲国产综合视频在线观看| 日韩精品在线不卡| 色狠狠色狠狠综合| 一级一级黄色片| 69久久99精品久久久久婷婷| 99久久一区二区| 亚洲国产毛片完整版| 久草视频在线看| 日韩视频精品在线| 欧美videossex| 欧美中文字幕视频在线观看| 四虎成人在线| 亚洲伊人一本大道中文字幕| 国产 欧美 在线| 99国产**精品****| 日本阿v视频在线观看| 国产精品资源| 一级黄色特级片| 成人一区在线观看| 亚洲色成人网站www永久四虎| 国产精品12区| 成年人网站免费在线观看| 中文字幕的久久| 国产性猛交普通话对白| 色婷婷国产精品| 国产精品久久久久久免费免熟| 日本精品一级二级| 国产麻豆91视频| 亚洲精品永久免费| 久久亚洲天堂| 欧美一性一乱一交一视频| 电影久久久久久| 99在线视频免费观看| 国产在线日韩精品| 粉嫩av一区二区三区天美传媒| 91精品国产麻豆国产在线观看 | 国产小视频免费在线网址| 视频在线观看99| 欧美调教sm| 91九色露脸| 日韩国产欧美一区二区| 欧美久久久久久久久久久久久| 狠狠爱www人成狠狠爱综合网| www国产免费| 久久久久久夜| 国产欧美视频一区| 亚洲特黄一级片| 欧美男人天堂网| 亚洲第一级黄色片| 日本在线人成| 国产suv精品一区二区三区88区| 欧美成a人片在线观看久| 99在线视频播放| 国产精品久久久久蜜臀| 欧美啪啪免费视频| 国产麻豆91精品| 五月天婷婷丁香网| 91国内精品野花午夜精品| 亚洲人午夜射精精品日韩| 欧美成人精品在线| 青青青国产精品| 日韩亚洲视频在线| 亚洲男女自偷自拍| 久久久久亚洲无码| 亚洲综合激情另类小说区| 亚洲性在线观看| 国产一区二区三区在线看| 日本蜜桃在线观看视频| 国产一区福利视频| 国产精品va| 中文字幕第10页| 亚洲精品五月天| 国产高清第一页| 久久成人精品一区二区三区| 免费一区二区三区四区| 日本中文不卡| 日韩精品免费专区| 久久成人激情视频| 在线观看中文字幕不卡| 国产一二三区在线视频| 日本免费一区二区三区视频观看| 日本久久一区| 伊人婷婷久久| 国产麻豆精品95视频| 欧美色图亚洲视频| 日韩欧美一二三| 黄污视频在线观看| 国产精品大全| 亚洲久久一区| 老熟妇精品一区二区三区| 亚洲午夜免费电影| 少妇一级淫片免费看| 9.1国产丝袜在线观看 | 白白色在线观看| 岛国视频一区免费观看| 亚洲性人人天天夜夜摸| 欧美在线一级片| 欧美日韩一区二区精品| 九色蝌蚪在线| 国产美女主播一区| 亚洲天堂免费| 欧亚乱熟女一区二区在线| 欧美色另类天堂2015| 成人p站proumb入口| 91欧美精品成人综合在线观看| 亚洲精品国模| 三级a三级三级三级a十八发禁止| 成人丝袜高跟foot| 久久夜靖品2区| 国产亚洲欧美日韩美女| 日韩成人在线电影| www.好吊操| 91免费版在线| 中文av免费观看| 欧美日韩不卡合集视频| 欧美1区2区3区4区| 久久人人爽av| 亚洲一区二区三区四区中文字幕| 国产三级第一页| 欧美激情精品在线| 最新国产精品视频| 亚洲自拍第三页| 欧美日韩免费看| 美女av在线播放| 国产综合欧美在线看| 免费观看日韩电影| 成人免费看片98| 中文字幕欧美精品日韩中文字幕| japanese23hdxxxx日韩| 好吊色这里只有精品| 久久无码av三级| 一级全黄裸体免费视频| 高清一区二区三区四区五区| 波多野结衣在线观看一区二区| 精品www久久久久奶水| 综合久久综合久久| 亚洲欧美一区二区三| 成人一区二区电影| 久久午夜精品一区二区| 久久久综合久久久| 中文字幕欧美亚洲| 美女av一区| 色网站在线视频|