2016-09-08 5 views
8

Ecto와 함께 실행할 쿼리에서 재귀 CTE의 결과를 어떻게 사용합니까?Ecto에서 재귀 CTE 사용

-- nodes table example -- 

id parent_id 
1 NULL 
2 1 
3 1 
4 1 
5 2 
6 2 
7 3 
8 5 

그래서 나는 또한 다른 테이블 nodes_users 구조화 있습니다 : 내가 가진 모든 사용자를 잡아하려면 지금

-- nodes_users table example -- 

node_id user_id 
1   1 
2   2 
3   3 
5   4 

예를 들어 이제 내가 그렇게 같이 구성 테이블 노드를 가지고 가정 해 봅시다 이나 특정 노드 위의 노드는, 예를 위해의 노드를 선택할 수 있도록 w 아이디/8

내가 그렇게 할 수있는 다음과 같은 재귀 쿼리를 사용할 수

:

WITH RECURSIVE nodes_tree AS (
    SELECT * 
    FROM nodes 
    WHERE nodes.id = 8 
UNION ALL 
    SELECT n.* 
    FROM nodes n 
    INNER JOIN nodes_tree nt ON nt.parent_id = n.id 
) 
SELECT u.* FROM users u 
INNER JOIN users_nodes un ON un.user_id = u.id 
INNER JOIN nodes_tree nt ON nt.id = un.node_id 

이 사용자 w/ID의 1, 2 *. 사용자를 반환해야하고, 4

는 내가 이상적으로 반환하는 방식으로, 체외을 사용하여이 같은 쿼리를 실행할 수있는 방법을 잘 모르겠어요 연결 가능한 출력. 조각 매크로를 사용하여 원시 SQL을 쿼리에 삽입 할 수 있다는 것을 이해합니다.하지만이 경로가 어디에서 사용되는지 또는 그 경로가 가장 적절한 경로인지는 확실하지 않습니다.

도움 및/또는 의견을 보내 주시면 감사하겠습니다.

답변

11

조각을 사용하여이를 수행 할 수있었습니다. 다음은 내가 사용한 코드 예제입니다. 이 메서드를 저장 프로 시저로 옮길 것입니다.

Repo.all(MyProj.User, 
    from u in MyProj.User, 
    join: un in MyProj.UserNode, on: u.id == un.user_id, 
    join: nt in fragment(""" 
    (
    WITH RECURSIVE node_tree AS (
     SELECT * 
     FROM nodes 
     WHERE nodes.id = ? 
    UNION ALL 
     SELECT n.* 
     FROM nodes n 
     INNER JOIN node_tree nt ON nt.parent_id == n.id 
    ) 
) SELECT * FROM node_tree 
    """, ^node_id), on: un.node_id == nt.id 
)