PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Lấy cây cha mẹ + con cái với lời hứa pg

Tôi là tác giả của pg-promise.

Khi bạn có 2 bảng:Parent -> Child với mối quan hệ 1-nhiều và bạn muốn nhận một mảng Parent phù hợp các hàng, mỗi hàng được mở rộng bằng thuộc tính children đặt thành một mảng các hàng tương ứng từ bảng Child ...

Có một số cách để thực hiện điều này, vì sự kết hợp giữa pg-promise và Promise nói chung là rất linh hoạt. Đây là phiên bản ngắn nhất:

db.task(t => {
    return t.map('SELECT * FROM Parent WHERE prop1 = $1', [prop1], parent => {
        return t.any('SELECT * FROM Child WHERE parentId = $1', parent.id)
            .then(children => {
                parent.children = children;
                return parent;
            });
    }).then(a => t.batch(a))
})
    .then(data => {
        /* data = the complete tree */
    });

Đây là những gì chúng tôi làm ở đó:

Đầu tiên, chúng tôi truy vấn Parent các mục, sau đó chúng tôi ánh xạ từng hàng thành một truy vấn cho Child tương ứng các mục, sau đó đặt các hàng của nó thành Parent và trả lại nó. Sau đó, chúng tôi sử dụng lô phương pháp để giải quyết mảng Child các truy vấn được trả về từ bản đồ phương pháp.

CẬP NHẬT cho ES7

Đây cũng giống như trên, nhưng sử dụng ES7 async / await cú pháp:

await db.task(async t => {
    const parents = await t.any('SELECT * FROM Parent WHERE prop1 = $1', [prop1]);
    for(const p of parents) {
        p.children = await t.any('SELECT * FROM Child WHERE parentId = $1', [p.id]);
    }
    return parents;
});
// the task resolves with the correct data tree

Nhiệm vụ sẽ giải quyết bằng một mảng như thế này:

[
    {
        "parent1-prop1", "parent1-prop2",
        "children": [
            {"child1-prop1", "child1-prop2"},
            {"child2-prop1", "child2-prop2"}
        ]
    },
    {
        "parent2-prop1", "parent2-prop2",
        "children": [
            {"child3-prop1", "child3-prop2"},
            {"child4-prop1", "child4-prop2"}
        ]
    }    
]

Tham chiếu API:bản đồ, lô

CẬP NHẬT

Xem câu trả lời hay hơn cho vấn đề này:Tham gia bảng dưới dạng mảng kết quả với PostgreSQL / NodeJS.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cột PostgreSQL 'foo' không tồn tại

  2. Thoát khỏi các tên cột giống từ khóa trong Postgres

  3. 3 cách liệt kê tất cả các thủ tục được lưu trữ tham chiếu đến một bảng trong PostgreSQL

  4. Postgres - Hàm trả về giao điểm của 2 ĐƯỜNG LÊN?

  5. Có cách nào để sử dụng ARRAY trong Entity Framework + PostgreSql không