精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久人人97超碰精品888| 欧美日韩国产高清一区二区三区 | 成人一区二区视频| 51视频国产精品一区二区| 国产一区二区三区精品在线| 国产精久久久| 懂色av中文一区二区三区天美| 日韩jizzz| 亚洲av无码乱码国产精品久久 | 天堂在线资源视频| 污视频在线免费观看网站| 91玉足脚交白嫩脚丫在线播放| 国产精品999| 欧美成人精品欧美一| 国产精品免费大片| 精品1区2区在线观看| 杨幂毛片午夜性生毛片| xxxcom在线观看| 国产精品成人一区二区艾草| 国产午夜精品在线| 91中文字幕在线视频| 国产精品免费看| 久久国产精品免费视频| 成人午夜福利一区二区| 亚洲一区二区三区中文字幕在线观看 | 亚洲一区精品视频| 日韩一二三四| 成人aaaa免费全部观看| 成人午夜激情网| 免费精品一区二区| 一本色道久久| 欧美黑人性猛交| 婷婷伊人五月天| av中文一区| 亚洲男人7777| 午夜不卡久久精品无码免费| 国产精品亚洲综合在线观看 | 亚洲精品成av人片天堂无码| 蜜桃精品视频在线观看| 国产99久久久欧美黑人| 中国一级特黄毛片| 亚洲高清在线| 久久久免费电影| 中文字幕在线观看成人| 99久久九九| 北条麻妃在线一区二区| 特级西西人体高清大胆| 波多野结衣在线观看一区二区三区 | 久久免费看视频| 91婷婷韩国欧美一区二区| 国产精品一区二区三区免费观看| 性欧美一区二区三区| 韩国av一区二区三区在线观看| 国产色视频一区| 亚洲字幕av一区二区三区四区| 日本三级亚洲精品| 国产精品久在线观看| 国产乡下妇女三片| 美女网站一区二区| 国产欧美日韩精品在线观看| 中文字幕日韩国产| 久草在线在线精品观看| 成人欧美一区二区三区在线| 96日本xxxxxⅹxxx17| 韩国av一区二区| 俄罗斯精品一区二区| 欧美一级特黄aaaaaa| 91在线国产福利| 日本高清不卡三区| 日本福利在线| 一区二区三区中文免费| 久久久久久久久久久99| 欧美成人ⅴideosxxxxx| 欧美日韩免费视频| 久久久精品视频国产| 国产精品nxnn| 亚洲小视频在线观看| 国产日韩精品中文字无码| 一区二区三区在线电影| 久久久欧美一区二区| 综合激情网五月| 久久精品国产77777蜜臀| 97在线电影| 免费一级在线观看播放网址| 国产精品欧美一区二区三区| 一二三四中文字幕| 忘忧草在线日韩www影院| 精品视频999| 国产人妻精品午夜福利免费| 思热99re视热频这里只精品| 色综合亚洲精品激情狠狠| 免费三片在线播放| 久久久久久久高潮| 91探花福利精品国产自产在线| 隣の若妻さん波多野结衣| 久久精品亚洲一区二区三区浴池 | 欧美日韩一区二区电影| 91人妻一区二区三区| 天美av一区二区三区久久| 日韩在线视频免费观看| 亚洲 欧美 视频| 极品尤物av久久免费看| 久久综合九色综合网站| av毛片在线免费看| 在线看一区二区| 野战少妇38p| 欧美wwwww| 日本久久亚洲电影| 亚洲欧美高清视频| 中文字幕一区av| 欧美丰满熟妇bbbbbb百度| 日本a人精品| 亚洲美女自拍视频| 精品无码一区二区三区电影桃花 | 午夜激情综合网| 久久久久久久久久一区| 国产亚洲电影| 97视频在线观看亚洲| 国产美女免费视频| 国产精品全国免费观看高清| 91精品91久久久中77777老牛| 玖玖玖视频精品| 国产一区二区三区网站| 91浏览器在线观看| 国产成人精品三级麻豆| 亚洲图片在线观看| 成人免费影院| 日韩av在线高清| 国产一级在线播放| 国产精品66部| 看全色黄大色大片| 日韩成人精品一区二区三区| 国产亚洲人成a一在线v站| 羞羞影院体验区| 成人高清伦理免费影院在线观看| 99精品一级欧美片免费播放| 97精品国产99久久久久久免费| 日韩高清欧美高清| 在线免费观看毛片| 大白屁股一区二区视频| 国产在线无码精品| 久久综合给合| 久国内精品在线| www.黄色小说.com| 夜夜嗨av一区二区三区四季av| 欧美一级免费在线| 亚洲乱码在线| 亚洲资源在线看| av理论在线观看| 日韩亚洲欧美在线| 欧美成人三级在线观看| 国产一区二区剧情av在线| 亚洲成人动漫在线| 日韩亚洲精品在线观看| 欧美激情xxxxx| 高h震动喷水双性1v1| 午夜一区二区三区视频| www.自拍偷拍| 六月天综合网| 日韩视频专区| 91成人在线网站| av一本久道久久波多野结衣| 国产 日韩 欧美 成人| 丰满白嫩尤物一区二区| 精品人妻少妇一区二区| 秋霞影院一区二区三区| 热99在线视频| av网站在线免费观看| 欧美日韩亚洲综合一区二区三区| 天堂av免费在线| 国产一区在线看| 黄色三级中文字幕| 欧美日韩一区二区三区在线电影| 国产91对白在线播放| 国产永久免费高清在线观看视频| 欧美日韩一区二区电影| 欧美久久久久久久久久久久| proumb性欧美在线观看| 人妻丰满熟妇av无码区app| 成人无号精品一区二区三区| 91性高湖久久久久久久久_久久99| 亚洲第一图区| 亚洲欧美日韩一区二区在线| 亚洲视频久久久| 亚洲午夜久久久久久久久电影院| 自拍偷拍中文字幕| 久草中文综合在线| 99色这里只有精品| 精品国产一区一区二区三亚瑟| 91免费高清视频| 欧美videosex性欧美黑吊| 国产丝袜视频一区| 国产欧美一区二区三区视频在线观看| 亚洲电影第三页| 亚洲精品视频免费| 黄色av电影网站| 欧美黄在线观看| 欧美精品123| 日韩三级av高清片| 国产精品wwww| 中文字幕中文字幕在线十八区 | 色欲欲www成人网站| 国产精品久久久久久久免费软件 | 欧美日韩久久不卡| 国产成人无码精品| 亚洲免费伊人电影| 真实乱视频国产免费观看| 国产成人免费在线| 中文字幕第100页| 国产美女诱惑一区二区| 日本一区二区三区四区五区六区| 欧美禁忌电影网| 粉嫩av免费一区二区三区| 成人全视频在线观看在线播放高清| 久久久亚洲精选| 黄色网页网址在线免费| 亚洲丝袜av一区| 天天操天天射天天舔| 欧美一区二区免费| 一级成人免费视频| 在线观看三级视频欧美| 国产成人在线免费观看视频| 一区二区在线观看av| 五月天色婷婷丁香| 国产女同性恋一区二区| 亚洲天堂网一区二区| 国产 欧美在线| 熟妇女人妻丰满少妇中文字幕| 免费高清不卡av| 成年人在线看片| 国产一区二区你懂的| 玩弄中年熟妇正在播放| 很黄很黄激情成人| 九九久久九九久久| 亚洲视频在线免费| 自拍偷拍一区二区三区| 日本黄色精品| 亚洲人体一区| 日韩欧美伦理| 一本色道久久99精品综合| av一区二区在线播放| 日韩亚洲视频在线| heyzo久久| 曰韩不卡视频| 91精品一区二区三区综合| 亚洲自拍偷拍一区二区三区| 国产精品久久久久久麻豆一区软件 | 日本国产一级片| 精品一区二区三区视频| 日韩视频在线观看一区二区三区| 狠狠色丁香婷婷综合| 久久精品久久99| 国产成人av在线影院| 日本精品一二三区| 91在线播放网址| 老熟妇一区二区| 国产精品三级av在线播放| 亚洲一二三四视频| 日韩毛片高清在线播放| 精品欧美一区二区久久久久| 亚洲图片自拍偷拍| 波多野结衣视频网站| 91黄视频在线| 一卡二卡在线视频| 日韩美女一区二区三区四区| 欧美熟女一区二区| 亚洲偷欧美偷国内偷| 91精品专区| 欧美理论电影在线播放| 2018av在线| 国产v综合ⅴ日韩v欧美大片| 久久影视精品| 国产98在线|日韩| 亚洲人成精品久久久| 正在播放亚洲| 99精品国产在热久久下载| 免费裸体美女网站| 国产呦精品一区二区三区网站| 亚洲午夜久久久久久久久| 久久丝袜美腿综合| 极品美妇后花庭翘臀娇吟小说| 夜色激情一区二区| 色av性av丰满av| 欧美一区二区成人| 色视频免费在线观看| 日韩亚洲国产中文字幕| av资源在线播放| 国产欧美韩国高清| 欧美久久香蕉| 一区视频二区视频| 一区二区三区精品视频在线观看| 色综合手机在线| 北条麻妃国产九九精品视频| 天天操天天干天天操天天干| 亚洲一区二区视频在线观看| 久久久久久久亚洲| 亚洲精品一区二区在线观看| 91精品专区| 日本成人免费在线| 亚洲高清999| 日韩精品一区二区三区四区五区| 欧美日韩一卡| 日韩av片网站| 99久久免费视频.com| 天天做夜夜爱爱爱| 色综合久久综合中文综合网| 亚洲精品综合久久| 日韩视频―中文字幕| 在线天堂资源www在线污| 亚洲aaaaaa| 日韩黄色大片网站| 黄色片视频在线免费观看| 国产精品一区一区三区| 欧美日韩国产黄色| 欧美日韩在线视频一区| 精品国产无码一区二区| 色哟哟入口国产精品| 国产成人精品亚洲日本在线观看| 国产日韩欧美精品| 欧美国内亚洲| 亚洲精品乱码久久久久久动漫| 久久精品视频免费| 久热这里只有精品6| 欧美mv日韩mv亚洲| 18videosex性欧美麻豆| 国产有码在线一区二区视频| 国产中文精品久高清在线不| 欧美网站免费观看| 成人高清av在线| 久久久一区二区三区四区| 欧美高清一级片在线| 99精品老司机免费视频| 国产精品久久久久久久久久免费| 婷婷成人在线| 日本www在线播放| 99re6这里只有精品视频在线观看| 精品亚洲永久免费| 日韩免费在线观看| а√天堂8资源在线官网| 成人久久18免费网站图片| 久久亚洲成人| 午夜剧场高清版免费观看| 国产精品国产三级国产有无不卡| 国产天堂第一区| 中文字幕av一区二区三区谷原希美 | 国产乱码精品一区二区亚洲 | 国产一级理论片| 欧美精品一区二区精品网| 2019中文字幕在线电影免费| 精品国产免费人成电影在线观...| 亚洲国产欧美国产综合一区| 丰满岳乱妇一区二区| 天天色综合天天| 男男激情在线| 国产精品自产拍高潮在线观看| 日韩在线视屏| 91av免费观看| 亚洲一二三级电影| 亚洲aaaaaaa| 国产成人综合精品| 国产精品久久久久久久久妇女| 欧美性猛交xxxx乱大交91| 亚洲综合色区另类av| 日本美女一级视频| 国产ts一区二区| 国产精品久久久久久久| 麻豆tv在线观看| 欧美午夜片在线免费观看| www.国产精品.com| 91中文字幕在线| 日韩午夜高潮| 日本免费www| 日韩三级视频在线看| freexxx性亚洲精品| 色播五月综合| 国产精品一二三区在线| 国产一级精品视频| 中文字幕欧美视频在线| 视频一区日韩精品| 99精品视频播放| 亚洲三级视频在线观看| 噜噜噜久久,亚洲精品国产品| 热久久免费视频精品| 希岛爱理一区二区三区| 精品熟女一区二区三区| 欧美在线视频全部完| 欧美精品videossex少妇| 欧美精品欧美精品| 国产久卡久卡久卡久卡视频精品| 精品美女久久久久| www.xxxx欧美| 哺乳挤奶一区二区三区免费看 | 国产一区二区在线视频| 国产成人无码一区二区三区在线| 一区二区三区视频免费| 视频一区在线| 第四色婷婷基地| 精品久久久久久久大神国产| 黄色网址在线免费观看| 久久久久久久久久久久久久一区|