2016-09-08 17 views
8

Làm cách nào để sử dụng kết quả của CTE đệ quy trong truy vấn mà tôi định chạy với Ecto? Ví dụ chúng ta hãy nói rằng tôi có một bảng, nút, cấu trúc như vậy:Sử dụng CTE đệ quy với Ecto

-- nodes table example -- 

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

và tôi cũng có một nodes_users bảng cấu trúc như vậy:

-- nodes_users table example -- 

node_id user_id 
1   1 
2   2 
3   3 
5   4 

Bây giờ, tôi muốn lấy tất cả những người sử dụng với một nút tại hoặc cao hơn một nút cụ thể, vì lợi ích của một ví dụ chúng ta hãy chọn nút w/id 8.

tôi có thể sử dụng đệ quy truy vấn sau đây để làm như vậy:

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 

này sẽ trả về người sử dụng. * Cho người sử dụng w/id của 1, 2, và 4.

Tôi không chắc chắn làm thế nào tôi có thể chạy truy vấn này cùng sử dụng ecto, lý tưởng một cách mà sẽ quay trở lại một đầu ra có thể thay đổi được. Tôi hiểu rằng tôi có thể chèn SQL thô vào truy vấn của mình bằng cách sử dụng macro phân đoạn, nhưng tôi không chắc chắn nơi nó sẽ đi cho việc sử dụng này hoặc nếu đó sẽ là tuyến đường thích hợp nhất để thực hiện.

Trợ giúp và/hoặc đề xuất sẽ được đánh giá cao!

Trả lời

11

Tôi đã có thể thực hiện việc này bằng cách sử dụng một đoạn. Dưới đây là ví dụ về mã tôi đã sử dụng. Tôi có thể sẽ di chuyển phương thức này sang một thủ tục lưu sẵn.

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 
) 
Các vấn đề liên quan