2017-11-17 29 views
0

私は4つのカラムid、name、designation、manager_idを持つテーブルを持っています。自己参照テーブルSQLクエリ

Raja CEO 
    Mani CTO 
    Kavi COO 
       Murugan Head 
         Alpha Head(Fin) 
          Kannan Head 
     Beta CFO 
     Delta Head 

は、私はSQLクエリは、特定の従業員のために可能なすべてのマネージャを表示したい: 表のスキーマは次のように

ID Name Designation Manager_id 
------------------------------------- 
1 Raja CEO 
2 Mani CTO   1 
3 Kavi COO   1 
4 Murugan Head   3 
5 Alpha Head(Fin)  4 
7 Kannan Head   4 

従業員の階層があり、次のように

CREATE TABLE "Employee_Information" 
(
    "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    "name" varchar, 
    "designation" varchar, 
    "manager_id" integer references employee_information(id) 
); 

それはあります。彼のジュニオールまたはその他の従業員の名前は、結果セットに含まれていないはずです。

他のすべての従業員を同じレベル以上で表示します。

私はこれに対する解決策を見つけ出すことができます。どんな助けもありがとうございます。クエリ以下

+0

あなたの問題を解決したか、あなたの解決策を見つけるのに最も役立っているので、回答を受け入れるには([* *クリック* *])(https://ibb.co/ikqyO6)してください。再実行して元に戻す)。 **受け入れる**答えは、問題が解決されたことを示しています。**解決策を探したり解決する質問を探すときに、**他の人に時間を節約します。 * ps:回答を受け入れると2つの評価ポイントが得られます。* –

答えて

1

参考渡すことができます。SQLite WITH clause

をあなたが「Rcursiveを必要とします組織階層を横断するために「CTE」(共通テーブル式)を使用します。このように:

クエリ

WITH RECURSIVE Emp_CTE (ID, Name, Designation, Manager_id, Manager_name) 
AS (
    SELECT ID, Name, Designation, Manager_id, cast(NULL as varchar) 
    FROM Employee_Information 
    WHERE Manager_ID IS NULL 
    UNION ALL 
     SELECT e.ID, e.Name, e.Designation, e.Manager_id, Emp_CTE.Name 
     FROM Employee_Information e 
     INNER JOIN Emp_CTE ON Emp_CTE.ID = e.Manager_id 
    ) 
SELECT * 
FROM Emp_CTE 

結果:

| ID | Name | Designation | Manager_id | Manager_name | 
|----|---------|-------------|------------|--------------| 
| 1 | Raja | CEO   | null  | null   | 
| 3 | Kavi | COO   | 1   | Raja   | 
| 2 | Mani | CTO   | 1   | Raja   | 
| 4 | Murugan | Head  | 3   | Kavi   | 
| 5 | Alpha | Head(Fin) | 4   | Murugan  | 
| 7 | Kannan | Head  | 4   | Murugan  | 

セットアップ:

CREATE TABLE "Employee_Information" ("id" INTEGER PRIMARY KEY AUTOINCREMENT 
NOT NULL, "name" varchar, "designation" varchar, "manager_id" integer references employee_information(id)); 



INSERT INTO Employee_Information 
    ("ID", "Name", "Designation", "Manager_id") 
VALUES 
    (1, 'Raja', 'CEO', NULL) 
; 

INSERT INTO Employee_Information 
    ("ID", "Name", "Designation", "Manager_id") 
VALUES 
    (2, 'Mani', 'CTO', '1') 
; 

INSERT INTO Employee_Information 
    ("ID", "Name", "Designation", "Manager_id") 
VALUES 
    (3, 'Kavi', 'COO', '1') 
; 

INSERT INTO Employee_Information 
    ("ID", "Name", "Designation", "Manager_id") 
VALUES 
    (4, 'Murugan', 'Head', '3') 
; 

INSERT INTO Employee_Information 
    ("ID", "Name", "Designation", "Manager_id") 
VALUES 
    (5, 'Alpha', 'Head(Fin)', '4') 
; 

INSERT INTO Employee_Information 
    ("ID", "Name", "Designation", "Manager_id") 
VALUES 
    (7, 'Kannan', 'Head', '4') 
; 

Demo

クエリ2

WITH RECURSIVE Emp_CTE (ID, Name, Designation, Manager_id, Manager_name, namepath) 
AS (
    SELECT ID, Name, Designation, Manager_id, cast(NULL as varchar), name as namepath 
    FROM Employee_Information 
    WHERE Manager_ID IS NULL 
    UNION ALL 
     SELECT e.ID, e.Name, e.Designation, e.Manager_id, Emp_CTE.Name 
    , Emp_CTE.namepath || '/' || e.Name 
     FROM Employee_Information e 
     INNER JOIN Emp_CTE ON Emp_CTE.ID = e.Manager_id 
    ) 
SELECT * 
FROM Emp_CTE 

結果:ソリューション

SELECT M.ID , M.NAME , M.DESIGNATION , N.NAME FROM EMPLOYEE_INFORMATION M 
INNER JOIN EMPLOYEE_INFORMATION N ON (M.manager_id<=N.manager_id or M.id=1) 
and M.name != N.name where N.ID = <employee_id>; 

見つかり

| ID | Name | Designation | Manager_id | Manager_name |   namepath   | 
|----|---------|-------------|------------|--------------|--------------------------| 
| 1 | Raja | CEO   | null  | null   | Raja      | 
| 3 | Kavi | COO   | 1   | Raja   | Raja/Kavi    | 
| 2 | Mani | CTO   | 1   | Raja   | Raja/Mani    | 
| 4 | Murugan | Head  | 3   | Kavi   | Raja/Kavi/Murugan  | 
| 5 | Alpha | Head(Fin) | 4   | Murugan  | Raja/Kavi/Murugan/Alpha | 
| 7 | Kannan | Head  | 4   | Murugan  | Raja/Kavi/Murugan/Kannan | 
0

動作します:

SELECT Name+' '+Designation AS 'Manager' FROM table1 WHERE ID=(SELECT manager_id FROM table1 WHERE ID='<employee_id>') 

をあなたが他の言語でこのクエリを実行している場合は、あなただけの変数保持EMPLOYEE_IDに

+0

デフォルト値は0です。これはCEOのIDです。employee_idのすべての値について同じ回答を得ています。 – Aravind

+0

employee_idが3と4のときにmanager_idがサブクエリと異なるため、サブクエリの結果であるmanager_idの詳細をフェッチします。 –

+0

"再帰"が必要です( "with cause"で利用可能) –

-1

あなたの助けのためにとにかく感謝。