選讀SQL經典實例筆記14_層次查詢

来源:https://www.cnblogs.com/lying7/archive/2023/07/28/17582910.html
-Advertisement-
Play Games

![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230726164318392-162588362.png) # 1. 結果集 ## 1.1. sql ```sql select empno,mgr from emp ord ...


1. 結果集

1.1. sql

select empno,mgr
  from emp
order by 2
    EMPNO        MGR
---------- ----------
      7788       7566
      7902       7566
      7499       7698
      7521       7698
      7900       7698
      7844       7698
      7654       7698
      7934       7782
      7876       7788
      7566       7839
      7782       7839
      7698       7839
      7369       7902
      7839

2. 展現父子關係

2.1. 結果集

2.1.1. sql

EMPS_AND_MGRS
------------------------------
FORD works for JONES
SCOTT works for JONES
JAMES works for BLAKE
TURNER works for BLAKE
MARTIN works for BLAKE
WARD works for BLAKE
ALLEN works for BLAKE
MILLER works for CLARK
ADAMS works for SCOTT
CLARK works for KING
BLAKE works for KING
JONES works for KING
SMITH works for FORD

2.2. DB2

2.3. Oracle

2.4. PostgreSQL

2.5. 自連接EMP表

2.5.1. sql

select a.ename || ' works for ' || b.ename as emps_and_mgrs
  from emp a, emp b
 where a.mgr = b.empno

2.6. MySQL

2.6.1. CONCAT函數連接字元串

2.6.1.1. sql

select concat(a.ename, ' works for ',b.ename) as emps_and_mgrs
  from emp a, emp b
 where a.mgr = b.empno

2.7. SQL Server

2.7.1. 加號“+”連接字元串

2.7.1.1. sql

select a.ename + ' works for ' + b.ename as emps_and_mgrs
  from emp a, emp b
 where a.mgr = b.empno

3. 展現祖孫關係

3.1. 結果集

3.1.1. sql

select ename,empno,mgr
  from emp
 where ename in ('KING','CLARK','MILLER')
ENAME           EMPNO        MGR
---------- ---------- ----------
CLARK            7782       7839
KING             7839
MILLER           7934       7782

3.1.2. sql

LEAF___BRANCH_ _ _ROOT
----------------------
MILLER-->CLARK-->KING

3.2. DB2

3.3. SQL Server

3.4. WITH遞歸查詢

3.4.1.   sql

with x (tree,mgr,depth)
    as (
select cast(ename as varchar(100)),
        mgr, 0
  from emp
 where ename = 'MILLER'
union all
select cast(x.tree+'-->'+e.ename as varchar(100)),
        e.mgr, x.depth+1
  from emp e, x
 where x.mgr = e.empno
)
select tree leaf___branch___root
  from x
 where depth = 2

3.4.2. SQL Server的字元串連接操作符+

3.4.3. DB2的字元串連接操作符||

3.5. Oracle

3.5.1. SYS_CONNECT_BY_PATH函數

3.5.1.1.  sql

select ltrim(
          sys_connect_by_path(ename,'-->'),
        '-->') leaf___branch___root
   from emp
  where level = 3
  start with ename = 'MILLER
connect by prior mgr = empno

3.6. PostgreSQL

3.7. MySQL

3.8. 自連接兩次

3.8.1. sql

select a.ename||'-->'||b.ename
              ||'-->'||c.ename as leaf___branch___root
  from emp a, emp b, emp c
 where a.ename = 'MILLER'
   and a.mgr = b.empno
   and b.mgr = c.empno

3.8.2. MySQL使用CONCAT函數

4. 創建層次視圖

4.1. 結果集

4.1.1. sql

EMP_TREE
-------------------------------
KING
KING - BLAKE
KING - BLAKE - ALLEN
KING - BLAKE - JAMES
KING - BLAKE - MARTIN
KING - BLAKE - TURNER
KING - BLAKE - WARD
KING - CLARK
KING - CLARK - MILLER
KING - JONES
KING - JONES - FORD
KING - JONES - FORD - SMITH
KING - JONES - SCOTT
KING - JONES - SCOTT – ADAMS

4.2. DB2

4.3. SQL Server

4.4. WITH遞歸查詢

4.4.1.   sql

with x (ename,empno)
     as (
 select cast(ename as varchar(100)),empno
   from emp
  where mgr is null
  union all
 select cast(x.ename||' - '||e.ename as varchar(100)),
        e.empno
   from emp e, x
  where e.mgr = x.empno
 )
 select ename as emp_tree
   from x
  order by 1

4.4.2. SQL Server使用字元串連接操作符 +

4.5. Oracle

4.5.1. CONNECT BY函數

4.5.1.1.  sql

select ltrim(
          sys_connect_by_path(ename,' - '),
        ' - ') emp_tree
   from emp
  start with mgr is null
connect by prior empno=mgr
  order by 1

4.6. PostgreSQL

4.6.1.  sql

select emp_tree
   from (
 select ename as emp_tree
   from emp
  where mgr is null
 union
 select a.ename||' - '||b.ename
   from emp a
        join
        emp b on (a.empno=b.mgr)
  where a.mgr is null
 union
 select rtrim(a.ename||' - '||b.ename
                     ||' - '||c.ename,' - ')
  from emp a
       join
       emp b on (a.empno=b.mgr)
       left join
       emp c on (b.empno=c.mgr)
 where a.ename = 'KING'
union
select rtrim(a.ename||' - '||b.ename||' - '||
             c.ename||' - '||d.ename,' - ')
  from emp a
       join
       emp b on (a.empno=b.mgr)
       join
       emp c on (b.empno=c.mgr)
       left join
       emp d on (c.empno=d.mgr)
 where a.ename = 'KING'
       ) x
 where tree is not null
 order by 1

4.7. MySQL

4.7.1.  sql

select emp_tree
   from (
 select ename as emp_tree
   from emp
  where mgr is null
 union
select concat(a.ename,' - ',b.ename)
  from emp a
       join
       emp b on (a.empno=b.mgr)
 where a.mgr is null
union
select concat(a.ename,' - ',
              b.ename,' - ',c.ename)
  from emp a
       join
       emp b on (a.empno=b.mgr)
       left join
       emp c on (b.empno=c.mgr)
 where a.ename = 'KING'
union
select concat(a.ename,' - ',b.ename,' - ',
              c.ename,' - ',d.ename)
  from emp a
       join
       emp b on (a.empno=b.mgr)
       join
       emp c on (b.empno=c.mgr)
       left join
       emp d on (c.empno=d.mgr)
 where a.ename = 'KING'
       ) x
 where tree is not null
 order by 1

5. 給定的父節點對應的所有子節點

5.1. 結果集

5.1.1. sql

ENAME
---------
JONES
SCOTT
ADAMS
FORD
SMITH

5.2. DB2

5.3. SQL Server

5.4. WITH遞歸查詢

5.4.1.     sql

with x (ename,empno)
      as (
  select ename,empno
    from emp
   where ename = 'JONES'
   union all
  select e.ename, e.empno
    from emp e, x
   where x.empno = e.mgr
  )
  select ename
    from x

5.5. Oracle

5.5.1. CONNECT BY子句

5.5.1.1.  sql

select ename
   from emp
  start with ename = 'JONES'
connect by prior empno = mgr

5.6. PostgreSQL

5.7. MySQL

5.8. 自連接

5.8.1. sql

create view v1
as
select ename,mgr,empno
  from emp
 where ename = 'JONES'

create view v2
as
select ename,mgr,empno
  from emp
 where mgr = (select empno from v1)

create view v3
as
select ename,mgr,empno
  from emp
 where mgr in (select empno from v2)

5.8.2. sql

select ename from v1
 union
select ename from v2
 union
select ename from v3

5.8.3. 需要提前知道層次關係的深度

6. 確認葉子節點、分支節點和根節點

6.1. 結果集

6.1.1. sql

ENAME         IS_LEAF  IS_BRANCH    IS_ROOT
---------- ---------- ---------- ----------
KING                 0         0          1
JONES                0         1          0
SCOTT                0         1          0
FORD                 0         1          0
CLARK                0         1          0
BLAKE                0         1          0
ADAMS                1         0          0
MILLER               1         0          0
JAMES                1         0          0
TURNER               1         0          0
ALLEN                1         0          0
WARD                 1         0          0
MARTIN               1         0          0
SMITH                1         0          0

6.2. DB2

6.3. PostgreSQL

6.4. MySQL

6.5. SQL Server

6.6. 3個標量子查詢

6.6.1. sql

select e.ename,
       (select sign(count(*)) from emp d
         where 0 =
           (select count(*) from emp f
             where f.mgr = e.empno)) as is_leaf,
       (select sign(count(*)) from emp d
         where d.mgr = e.empno
           and e.mgr is not null) as is_branch,
       (select sign(count(*)) from emp d
         where d.empno = e.empno
           and d.mgr is null) as is_root
   from emp e
 order by 4 desc,3 desc

6.7. Oracle

6.7.1.  sql

select ename,
        connect_by_isleaf is_leaf,
        (select count(*) from emp e
          where e.mgr = emp.empno
            and emp.mgr is not null
            and rownum = 1) is_branch,
        decode(ename,connect_by_root(ename),1,0) is_root
   from emp
  start with mgr is null
connect by prior empno = mgr
order by 4 desc, 3 desc

6.7.1.1. Oracle Database 10g新增的CONNECT_BY_ROOT和CONNECT_BY_ISLEAF


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

-Advertisement-
Play Games
更多相關文章
  • 參考文獻: http://www.js-code.com/xindejiqiao/xindejiqiao_274882.html https://www.cnblogs.com/xiaoxiaotank/p/15811749.html 編寫代碼過程中不理解的代碼可參考上面的文獻 首先需要配置你的Pr ...
  • #1. 可空類型修飾符? ```CSharp int i? num=null;//表示可空的整型 DateTime time? dateTime=null; //表示可空的時間 ``` #2.三元(運算符)表達式?: ```C# x?y:z //表示如果表達式x為true,則返回y,如果x為fals ...
  • # 在虛擬機(VMware)上安裝OpenKylin開源操作系統 今天我們一下學習下開放麒麟系統的安裝。也是我的開源項目在OpenKylin上運行的實踐。 希望通過該項目瞭解和學習Avalonia開發的朋友可以在我的github上拉取代碼,同時希望大家多多點點star。 https://github ...
  • Windows 服務預設的遠程桌面服務埠號是3389,在創建完Azure VM之後基本都會添加一個any to any的防火牆規則,方便多人登錄這個機器。 但是隨時隨地的3389掃描搞得我很煩,就修改了預設的windows 遠程桌面服務的埠號,修改完沒有在VM里的windows 自帶防火牆中添加 ...
  • 在Linux標準IO中,就是用庫函數對文件進行操作。在C語言中有許多庫函數方便用戶去對文件進行操作。下麵談談一些簡單基本的函數,這些函數都是被包含在頭文件stdio.h中的。 一、fopen()函數 要操作一個文件,我們肯定先打開它,這裡打開並不是去右鍵文件然後左鍵打開。這裡的打開是指讓系統知道程式 ...
  • ## 1、CentOS-7 > 註意:下列命令要用root賬號/許可權執行 ### 1.1、查看防火牆狀態 ``` systemctl status firewalld ``` ### 1.2、非永久性關閉防火牆 ``` systemctl stop firewalld ``` ### 1.3、非永久 ...
  • # 一、複製文件夾cp ``` cp -a vue vue-copy ``` 將vue 文件夾下麵的所有文件,複製到同目錄下vue-copy文件夾下麵 ![image](https://img2023.cnblogs.com/blog/3202319/202307/3202319-202307271 ...
  • 碼農一枚,Mac作為生產力工具已經有10多年了。 用Mac的原因除了系統清爽,逼格高之外,最主要還是因為作為一個資深全棧,要做Apple相關開發,必須用MacOS系統。😅 與Windows不同,MacOS上流行使用的軟體很多都很小眾,作者也不是大廠,但有很多卻很實用,這裡介紹幾款我常用的免費軟體。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...