2017-03-13 8 views
1

特定のマネージャの従業員階層全体を取得しようとしています。以下のようPostgreSQLの再帰が予期しない結果を返す

の表は、次のとおりです。私は、次の再帰実行すると

| id | manager | 
----------------- 
| 103 | 138  | 
| 125 | 138  | 
| 114 | 103  | 
| 122 | 103  | 
| 138 | NULL | 
| 144 | 222  | 
| 222 | NULL | 

id :: int 
manager :: foreign key(users) 

データ

WITH RECURSIVE managed AS (
     SELECT manager AS manager_id, id AS employee_id 
     FROM users 
     WHERE manager = 138 
    UNION 
     SELECT u2.manager AS manager_id, u2.id as employee_id 
     FROM users u2 
     INNER JOIN managed m ON m.employee_id = u2.id 
    ) 


select * 
from managed; 

を私が間違った結果を受け取っ:

予想されるが

は:

| employee_id | manager_id | 
----------------------------- 
| 103   | 138  | 
| 125   | 138  | 
| 114   | 103  | 
| 122   | 103  | 

(正確に...下記のリンクショーとして)私は多くの例が含ま::私の質問に似ていますが、それらのどれも働いたthis oneを、試してみました。 ..私はUNION ALL実行してクエリを実行しようとした

決して終了する(数分後、私は実行を中止しなければならなかった)事前に

感謝:)

ここでは

答えて

1

あなたは小さな誤差を持っている - あなたはm.employee_id = u2.managerないm.employee_id = u2.idに参加する必要があります。

WITH RECURSIVE managed AS (
     SELECT manager AS manager_id, id AS employee_id 
     FROM users 
     WHERE manager = 138 
    UNION 
     SELECT u2.manager AS manager_id, u2.id as employee_id 
     FROM users u2 
     INNER JOIN managed m ON m.employee_id = u2.manager 
    ) 


select * 
from managed; 

結果があります:

manager_id | employee_id 
------------+------------- 
     138 |   103 
     138 |   125 
     103 |   114 
     103 |   122 
(4 rows) 
+0

私はそれを試したと確信しています...ありがとうございます:) –

0

従業員の階層を見つける方法です。

WITH managers AS (
    SELECT u.id 
    FROM users u 
    WHERE exists (SELECT 1 FROM users WHERE manager = u.id LIMIT 1) 
) 
SELECT u.id as employee_id, m.id as manager_id 
FROM users u 
JOIN managers m ON m.id = u.manager; 

- >

employee_id | manager_id 
-------------+------------ 
     122 |  103 
     114 |  103 
     103 |  138 
     125 |  138 
(4 rows) 
+0

こんにちは@Gab答えのため、これは私の問題を解決しないので、全体の会社の階層(トップレベルのマネージャー、NULLのマネージャーを持っていない)を返しますので。特定のマネージャーの階層を取得しようとしています。会社の階層を返すためには、私は 'SELECT * FROM users from manager is NOT NULL; –

+0

こんにちは@OldFoxあなたはあなたの質問に期待した結果を与えてくれたので、ちょっと混乱しています。あなたが望むものでないなら、期待される結果を更新してください。 – Gab

+0

こんにちは@Gab私は私の質問を更新しました。与えられたデータセットと期待される結果の両方。 –

関連する問題