PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

dapatkan tabel GABUNG sebagai array hasil dengan PostgreSQL/NodeJS

Ini mudah dilakukan dengan 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);
    });

Sama seperti di atas, tetapi menggunakan ES7 async /await sintaks:

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:peta, apa saja, tugas, kumpulan

Pertanyaan terkait:

  • Dapatkan pohon induk + anak dengan pg-promise
  • Tugas bersyarat dengan pg-promise

Dan jika Anda ingin menggunakan hanya satu kueri, maka menggunakan sintaks PostgreSQL 9.4 dan yang lebih baru, Anda dapat melakukan hal berikut:

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

Dan contoh pg-promise Anda adalah:

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

Dan Anda pasti ingin menyimpan kueri kompleks seperti itu di file SQL eksternal. Lihat File Kueri.

Kesimpulan

Pilihan antara dua pendekatan yang disajikan di atas harus didasarkan pada persyaratan kinerja aplikasi Anda:

  • Pendekatan kueri tunggal lebih cepat, tetapi agak sulit untuk dibaca atau diperluas, karena cukup bertele-tele
  • Pendekatan multi-kueri lebih mudah dipahami dan diperluas, tetapi tidak bagus untuk kinerja, karena jumlah kueri yang dijalankan dinamis.

PERBARUI-1

Jawaban terkait berikut menawarkan lebih banyak opsi, dengan menggabungkan kueri turunan, yang akan memberikan kinerja yang jauh lebih baik:Gabungkan kueri loop bersarang ke hasil induk pg-promise.

PERBARUI-2

Contoh lain ditambahkan, menggunakan ES7 async /await pendekatan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Impor Data Excel ke PostgreSQL 9.3

  2. Permintaan rekursif postgres dengan row_to_json

  3. pip install gagal dengan /usr/bin/clang:Tidak ada file atau direktori seperti itu

  4. Ikhtisar Berbagai Node Paket Tambahan di PostgreSQL

  5. Kegagalan Otomatis Database Moodle PostgreSQL