Erhalte einen Eltern + Kinder Baum mit pg-Versprechen
Ich verwende daspg-promise
Bibliothek mitbluebird
für abhängige Abfragen. Ich habe zwei Tabellen, a und b, die so aussehen:
| a | | b |
|-------| |-------|
| a_id | | b_id |
| prop1 | | prop2 |
| b_a |
wob.b_a
ist ein Verweis aufa.a_id
. Ich möchte alle Einträge auswählen, die mit einem bestimmten @ übereinstimmeprop1
und das Ergebnis sollte alle passenden @ enthalta
-Zeilen plus das entsprechendeb
-Zeilen für jedesa
. Dies sollte mit zwei abhängigen Abfragen möglich sein. Beide Abfragen geben möglicherweise mehrere Ergebnisse zurück.
Wenn Tabellea
gibt nur eine Zeile zurück Ich kann das tun:
function getResult(prop1) {
return db.task(function (t) {
return t.one("select * from a where prop1=$1", prop1)
.then(function (a) {
return t.batch([a, t.any("select * from b where b_a=$1", a.a_id)]);
})
.then(function (data) {
var a = data[0];
var bs = data[1];
bs.forEach(function (b) {
b.a = a;
});
return bs;
});
});
}
Und ich kann auch alle passenden @ bekommb
-Einträge für mehrerea
-Ergebnisse wie folgt:
function getResult(prop1) {
return db.task(function (t) {
return t.many("select * from a where prop1=$1", prop1)
.then(function (as) {
var queries = [];
as.forEach(function (a) {
queries.push(t.any("select * from b where b_a=$1", a.id));
});
return t.batch(queries); // could concat queries with as here, but there wouldn't be a reference which b row belongs to which a row
})
.then(function (data) {
// data[n] contains all matching b rows
});
});
}
Aber wie bringt man diese beiden zusammen?