pg-promise - Combine multiple nested loop queries to parent array result

吃可爱长大的小学妹 提交于 2019-12-25 02:26:10

问题


My question is based on Combine nested loop queries to parent array result - pg-promise. I'm having a similar scenario but have multiple queries to be combined to get my final results. Following is my code with which I tried to implement my requirement. But I was not able to get the results from second query combined with the main query. I'm a beginner and would like to know the correct way of implementation.

  db.task(t => {
    const a = studies => t.any ('SELECT facility_contacts.name, facility_contacts.email, facility_contacts.phone FROM facility_contacts WHERE nct_id = $1', studies.nct_id).then(facility_contacts => {
    studies.facility_contacts = facility_contacts;
    return studies
      });
    const b = studies => t.any ('SELECT eligibilities.criteria, eligibilities.gender FROM eligibilities WHERE nct_id = $1', studies.nct_id).then(eligibilities => {
    studies.eligibilities = eligibilities;
    return studies;
      });
  return t.map('SELECT studies.nct_id, studies.official_title, studies.phase, facilities.country FROM studies, facilities WHERE facilities.country LIKE \'%Ireland%\' LIMIT 10',[], a, b).then(t.batch);
}).then(studies => {
  console.log(studies);
  res.send(studies);
}).catch(error => {
  console.log(error);
});

Thanks in advance.


回答1:


Here's one possibility:

db.task(t => {
    const a = studies => t.any('SELECT facility_contacts.name, facility_contacts.email, facility_contacts.phone FROM facility_contacts WHERE nct_id = $1', studies.nct_id)
        .then(facility_contacts => {
            studies.facility_contacts = facility_contacts;
            return studies
        });
    const b = studies => t.any('SELECT eligibilities.criteria, eligibilities.gender FROM eligibilities WHERE nct_id = $1', studies.nct_id)
        .then(eligibilities => {
            studies.eligibilities = eligibilities;
            return studies;
        });
    const c = studies => t.batch([a(studies), b(studies)]);
    return t.map('SELECT studies.nct_id, studies.official_title, studies.phase, facilities.country FROM studies, facilities WHERE facilities.country LIKE \'%Ireland%\' LIMIT 10', [], c)
        .then(t.batch);
})
    .then(studies => {
        console.log(studies);
        res.send(studies);
    })
    .catch(error => {
        console.log(error);
    });

There can be many different approaches, some way better performing, like JSON-based.




回答2:


You can use Promise.all to get all result

db.task(t => {
    const queries = [
        t.any('SELECT facility_contacts.name, facility_contacts.email, facility_contacts.phone FROM facility_contacts WHERE nct_id = $1', studies.nct_id),
        t.any('SELECT eligibilities.criteria, eligibilities.gender FROM eligibilities WHERE nct_id = $1', studies.nct_id),
        t.map('SELECT studies.nct_id, studies.official_title, studies.phase, facilities.country FROM studies, facilities WHERE facilities.country LIKE \'%Ireland%\' LIMIT 10', [], a, b)
    ];
    return Promise.all(queries);
}).then((ResultArrayOfQueries) => {
    console.log(ResultArrayOfQueries);
    // Combine as per your requirement
    res.send(ResultArrayOfQueries);
}).catch(error => {
    console.log(error);
});


来源:https://stackoverflow.com/questions/51476472/pg-promise-combine-multiple-nested-loop-queries-to-parent-array-result

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!