2017-02-16 74 views
0

我表中有三個字段定義存在於MySQL數據庫的層次關係。MySQL中的分層查詢。 (由等效爲MySQL連接)

Table Name : tb_corp 
-------------------------------------------- 
    comp_code | incharge_comp_Code | mngr_emp_no 

    A  |     | 111 
-------------------------------------------- 
    B  |   A   | 
-------------------------------------------- 
    C  |   B   |  
-------------------------------------------- 

如何編寫一個查詢來獲取mngr_emp_no = 111負責的所有comp_code。根據上表,111負責三家公司(A,B和C)。原因是A公司負責B公司,B公司負責C公司,A公司也負責C公司。 (A→B)(B→C)==(A→C)

+0

這種簡單的分層模型並沒有真正自己借給你婉做這種分析。鄰接列表將使其變得簡單。另請參見http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database – symcbean

+0

@symcbean:該模式*是*鄰接表。所以我不理解你的評論......一個「鄰接列表會讓它變得簡單。」許多數據庫確實支持鄰接列表的分層查詢。在Oracle中非常簡單,使用'CONNECT BY'。在SQL Server中使用遞歸CTE更復雜一些。但是MySQL沒有這些功能的等價物。 – spencer7593

回答

0

在MySQL中沒有本地層次查詢支持。

對於要遍歷的有限數量的級別,我們可以編寫查詢來獲取每個級別的結果,並將結果與​​UNION ALL運算符組合。或者,我們可以編寫一個MySQL存儲程序(過程)以獲得更多的遞歸方法。

作爲使用原生SQL查詢一個的方法例如:

SELECT t0.comp_code 
    FROM tb_corp t0 
    WHERE t0.mgr_emp_no = 111 

UNION ALL 

SELECT t1.comp_code 
    FROM tb_corp t0 
    JOIN tb_corp t1 ON t1.incharge_comp_code = t0.comp_code 
WHERE t0.mgr_emp_no = 111 

UNION ALL 

SELECT t2.comp_code 
    FROM tb_corp t0 
    JOIN tb_corp t1 ON t1.incharge_comp_code = t0.comp_code 
    JOIN tb_corp t2 ON t2.incharge_comp_code = t1.comp_code 
WHERE t0.mgr_emp_no = 111 

UNION ALL 

SELECT t3.comp_code 
    FROM tb_corp t0 
    JOIN tb_corp t1 ON t1.incharge_comp_code = t0.comp_code 
    JOIN tb_corp t2 ON t2.incharge_comp_code = t1.comp_code 
    JOIN tb_corp t3 ON t3.incharge_comp_code = t2.comp_code 
WHERE t0.mgr_emp_no = 111 

等。這種方法可以擴展至T4,T5,T6,...下降到一些(合理)有限數量的級別。

對於更多的遞歸方法,可以編寫一個MySQL存儲程序(PROCEDURE)。