PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Вземете дърво родители + деца с pg-promise

Аз съм автор на pg-promise.

Когато имате 2 таблици:Parent -> Child с връзка 1 към много и искате да получите масив от съвпадащи Parent редове, всеки ред е разширен със свойство children зададете на масив от съответните редове от таблица Child ...

Има няколко начина да постигнете това, тъй като комбинацията от pg-promise и обещания като цяло е много гъвкава. Ето най-кратката версия:

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 */
    });

Ето какво правим там:

Първо, ние правим заявка за Parent елементи, след което преобразуваме всеки ред в заявка за съответния Child елементи, който след това задава своите редове в Parent и го връща. След това използваме метод пакет, за да разрешим масива на Child заявки, върнати от картата на методите.

АКТУАЛИЗИРАНЕ за ES7

Тук е същото като по-горе, но използвайки ES7 async /await синтаксис:

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

Задачата ще бъде разрешена с масив като този:

[
    {
        "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"}
        ]
    }    
]

Препратки към API:карта, партида

АКТУАЛИЗИРАНЕ

Вижте по-добър отговор на това:JOIN таблица като масив от резултати с 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. Мога ли да помоля Postgresql да игнорира грешки в транзакция

  2. Django-DB-Migrations:не може да ALTER TABLE, защото има чакащи задействащи събития

  3. Извличане на коментари от PostgreSQL DB

  4. Избройте всички последователности в Postgres db 8.1 с SQL

  5. Как да идентифицираме проблеми с производителността на PostgreSQL с бавни заявки