sql >> Database teknologi >  >> RDS >> PostgreSQL

få JOIN-tabel som en række resultater med PostgreSQL/NodeJS

Dette er nemt at gøre med 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);
    });

Det samme som ovenfor, men ved hjælp af ES7 async /await syntaks:

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:kort, enhver, opgave, batch

Relaterede spørgsmål:

  • Få et forældre + børn træ med pg-løfte
  • Betinget opgave med pg-løfte

Og hvis du kun vil bruge en enkelt forespørgsel, kan du bruge PostgreSQL 9.4 og senere syntaks, så du kan gøre følgende:

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

Og så ville dit pg-løfte eksempel være:

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);

Og du vil helt sikkert beholde sådanne komplekse forespørgsler i eksterne SQL-filer. Se Forespørgselsfiler.

Konklusion

Valget mellem de to fremgangsmåder, der er præsenteret ovenfor, bør være baseret på ydeevnekravene for din ansøgning:

  • Enkelt-forespørgsel-tilgangen er hurtigere, men er noget svær at læse eller udvide, da den er ret omfattende
  • Multiforespørgselstilgangen er nemmere at forstå og udvide, men den er ikke god til ydeevne på grund af det dynamiske antal udførte forespørgsler.

OPDATERING-1

Følgende relaterede svar giver flere muligheder ved at sammenkæde underordnede forespørgsler, hvilket vil give en meget forbedret ydeevne:Kombiner indlejrede loop-forespørgsler til overordnet resultat pg-promise.

OPDATERING-2

Et andet eksempel tilføjet ved hjælp af ES7 async /await tilgang.



  1. Android SQLite Query - Henter de seneste 10 poster

  2. JSON_QUERY() vs JSON_VALUE() i SQL Server:Hvad er forskellen?

  3. Administreret ODP.NET-driver vises ikke i dialogboksen Datakilde

  4. MySQL TEKST vs BLOB vs CLOB