2017-07-31 8 views
0

従業員ID、従業員名、従業員レベル、スーパバイザID、およびスーパーバイザ名を取得し、特定の従業員の組織構造を持つ各レコードのすべての同じデータを返すSQLクエリを作成しようとしていますCEOから管理階層クエリ

理想的には、私は達成するために探しています:

employee_id, name, employee_level, supervisor_id, supervisor_name, L1_supervisor_id, L1_supervisor_name, L2_supervisor_id, L2_supervisor_name... 

私は、以下のものを使用してCEOから管理階層を降りることができます。

SELECT 
lev01.employee_id id_01, lev01.name name_01, lev01.emp_type class_01, 
lev02.employee_id id_02, lev02.name name_02, lev02.emp_type class_02, 
lev03.employee_id id_03, lev03.name name_03, lev03.emp_type class_03, 
lev04.employee_id id_04, lev04.name name_04, lev04.emp_type class_04, 
lev05.employee_id id_05, lev05.name name_05, lev05.emp_type class_05, 
lev06.employee_id id_06, lev06.name name_06, lev06.emp_type class_06, 
lev07.employee_id id_07, lev07.name name_07, lev07.emp_type class_07, 
lev08.employee_id id_08, lev08.name name_08, lev08.emp_type class_08, 
lev09.employee_id id_09, lev09.name name_09, lev09.emp_type class_09, 
lev10.employee_id id_10, lev10.name name_10, lev10.emp_type class_10, 
lev11.employee_id id_11, lev11.name name_11, lev11.emp_type class_11, 
lev12.employee_id id_12, lev12.name name_12, lev12.emp_type class_12, 
lev13.employee_id id_13, lev13.name name_13, lev13.emp_type class_13, 
lev14.employee_id id_14, lev14.name name_14, lev14.emp_type class_14, 
lev15.employee_id id_15, lev15.name name_15, lev15.emp_type class_15, 
lev16.employee_id id_16, lev16.name name_16, lev16.emp_type class_16, 
lev17.employee_id id_17, lev17.name name_17, lev17.emp_type class_17, 
lev18.employee_id id_18, lev18.name name_18, lev18.emp_type class_18 
FROM emp_lst lev01 
LEFT OUTER JOIN emp_lst lev02 ON lev01.employee_id = lev02.supervisor_id 
LEFT OUTER JOIN emp_lst lev03 ON lev02.employee_id = lev03.supervisor_id 
LEFT OUTER JOIN emp_lst lev04 ON lev03.employee_id = lev04.supervisor_id 
LEFT OUTER JOIN emp_lst lev05 ON lev04.employee_id = lev05.supervisor_id 
LEFT OUTER JOIN emp_lst lev06 ON lev05.employee_id = lev06.supervisor_id 
LEFT OUTER JOIN emp_lst lev07 ON lev06.employee_id = lev07.supervisor_id 
LEFT OUTER JOIN emp_lst lev08 ON lev07.employee_id = lev08.supervisor_id 
LEFT OUTER JOIN emp_lst lev09 ON lev08.employee_id = lev09.supervisor_id 
LEFT OUTER JOIN emp_lst lev10 ON lev09.employee_id = lev10.supervisor_id 
LEFT OUTER JOIN emp_lst lev11 ON lev10.employee_id = lev11.supervisor_id 
LEFT OUTER JOIN emp_lst lev12 ON lev11.employee_id = lev12.supervisor_id 
LEFT OUTER JOIN emp_lst lev13 ON lev12.employee_id = lev13.supervisor_id 
LEFT OUTER JOIN emp_lst lev14 ON lev13.employee_id = lev14.supervisor_id 
LEFT OUTER JOIN emp_lst lev15 ON lev14.employee_id = lev15.supervisor_id 
LEFT OUTER JOIN emp_lst lev16 ON lev15.employee_id = lev16.supervisor_id 
LEFT OUTER JOIN emp_lst lev17 ON lev16.employee_id = lev17.supervisor_id 
LEFT OUTER JOIN emp_lst lev18 ON lev17.employee_id = lev18.supervisor_id 
WHERE lev01.supervisor_id IS NULL; 

これは、二つの領域で足り:

  1. クエリの読み込みと保守が少し難しいです。私はそれを最適化/短縮する方法があると確信していますが、これまでは適切な選択肢を見つけることができませんでした。

  2. 元のレコードがなければ、これらのレコードを元のテーブルに戻す手動プロセスになります。

ここでSQLiteを使用していますが、ここではSQLiteを使用しています。

+0

元のレコードがなければ、これらのレコードを元のテーブル*に戻す手動プロセスになります。それは私に読むことが難しく見えません。最初の2行の後は、それが滝で繰り返していることがわかります。 – scsimon

+1

[documentation](https://stackoverflow.com/documentation/sql/747/common-table-expressions)を参照してください。 –

答えて

2

recursive queriesが必要です。

WITH RECURSIVE org_chart(employee_id, name, emp_type) AS (
    SELECT employee_id, name, emp_type 
    FROM emp_lst 
    WHERE supervisor_id IS NULL 

    UNION ALL 

    SELECT employee_id, name, emp_type 
    FROM emp_lst e JOIN org_chart o ON e.supervisor_id = o.employee_id 
) 
SELECT * FROM org_chart; 

私が提供したリンクをさらに読む。

SQLiteは、バージョン3.8.3(2014-02-03)以降の再帰クエリをサポートしています。

他のほとんどすべてのブランドのSQLデータベースは、再帰的なクエリ構文もサポートしています。 https://www.percona.com/blog/2014/02/11/wither-recursive-queries/

MySQLはサポートを追加する最後のバージョンで、次のバージョン8.0に入っています。