Я использую библиотеку pg-promise
с bluebird
для выполнения зависимых запросов. У меня есть две таблицы, a и b, которые выглядят так:
| a | | b |
|-------| |-------|
| a_id | | b_id |
| prop1 | | prop2 |
| b_a |
где b.b_a
- ссылка на a.a_id
. Я хочу выбрать все записи, соответствующие заданному prop1
, и результат должен содержать все совпадающие a
-строк плюс соответствующие b
-строк для каждого a
. Это должно быть выполнено с двумя зависимыми запросами. Оба запроса могут возвращать несколько результатов.
Если таблица a
возвращает только одну строку, я могу сделать это:
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;
});
});
}
И я также могу получить все совпадающие b
-записи для нескольких a
-результатов, например:
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
});
});
}
Но как объединить этих двоих?
as[n]
вместе сdata[n]
. Посмотрите здесь, как получить доступ кas
. - person Bergi   schedule 06.06.2016a
иb
существует связь один-ко-многим, поэтому индайсы здесь не помогут. - person Krxldfx   schedule 06.06.2016batch
? Развеdata
не какой-то двумерный массив? - person Bergi   schedule 06.06.2016where a.a_b is a reference
- в таблицеa
нетa_b
. - person vitaly-t   schedule 07.06.2016the result should contain all matching a-rows plus the corresponding b-rows for each a.
хотите ли вы один объект с деревом или какой-нибудь массив? Не совсем понятно, какой именно тип вывода вам нужен. - person vitaly-t   schedule 07.06.2016