sql >> Databáze >  >> RDS >> PostgreSQL

získat tabulku JOIN jako pole výsledků s PostgreSQL/NodeJS

To lze snadno provést pomocí pg-promise:

function buildTree(t) {
    const v = q => t.any('SELECT id, value FROM votes WHERE question_id = $1', q.id)
        .then(votes => {
            q.votes = votes;
            return q;
        });

    return t.map('SELECT * FROM questions', undefined, v).then(a => t.batch(a));
}

db.task(buildTree)
    .then(data => {
        console.log(data); // your data tree
    })
    .catch(error => {
        console.log(error);
    });

Stejné jako výše, ale pomocí ES7 async /await syntaxe:

await db.task(async t => {
    const questions = await t.any('SELECT * FROM questions');
    for(const q of questions) {
        q.votes = await t.any('SELECT id, value FROM votes WHERE question_id = $1', [q.id]);
    }
    return questions;
});
// method "task" resolves with the correct data tree

API:map, any, task, batch

Související otázky:

  • Získejte strom rodičů a dětí s pg-promise
  • Podmíněný úkol s pg-promise

A pokud chcete použít pouze jeden dotaz, pak pomocí PostgreSQL 9.4 a novější syntaxe můžete provést následující:

SELECT json_build_object('id', q.id, 'content', q.content, 'votes',
    (SELECT json_agg(json_build_object('id', v.id, 'value', v.value))
     FROM votes v WHERE q.id = v.question_id))
FROM questions q

A váš příklad pg-promise by pak byl:

const query =
    `SELECT json_build_object('id', q.id, 'content', q.content, 'votes',
        (SELECT json_agg(json_build_object('id', v.id, 'value', v.value))
         FROM votes v WHERE q.id = v.question_id)) json
    FROM questions q`;
    
const data = await db.map(query, [], a => a.json);

A určitě budete chtít uchovávat takové složité dotazy v externích souborech SQL. Viz Soubory dotazů.

Závěr

Volba mezi dvěma výše uvedenými přístupy by měla být založena na požadavcích na výkon vaší aplikace:

  • Přístup s jedním dotazem je rychlejší, ale je poněkud obtížně čitelný nebo rozšířený, protože je poměrně podrobný
  • Přístup s více dotazy je snazší pochopit a rozšířit, ale vzhledem k dynamickému počtu prováděných dotazů není skvělý pro výkon.

AKTUALIZACE-1

Následující související odpověď nabízí více možností zřetězením podřízených dotazů, což poskytne mnohem lepší výkon:Kombinujte dotazy vnořené smyčky s nadřazeným výsledkem pg-promise.

AKTUALIZACE-2

Přidán další příklad pomocí ES7 async /await přístup.



  1. Je možné vytvořit typy objektů databáze Oracle uvnitř PL/SQL?

  2. ADO.net SqlTransaction zlepšuje výkon

  3. Dynamicky přiřaďte název souboru k připojovacímu řetězci aplikace Excel

  4. SQL Reference pro začátečníky