2017-02-16 3 views
0

テーブルには、MySQLデータベースに存在する階層関係を定義する3つのフィールドがあります。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社は3社(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を使用するとかなりシンプルです。再帰的なCTEを持つSQL Serverにはもう少し複雑です。しかし、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)を記述することができます。

関連する問題