【问题标题】:How to merge multiple dynamic queries如何合并多个动态查询
【发布时间】:2019-01-15 06:19:13
【问题描述】:

我正在使用node 与我的postgresql 数据库进行通信。
我有一份汽车清单:

[{id:1, areaId: 1}, 
 {id:2, areaId: 2}, 
 {id:3, areaId: 2}]

areaId 是另一个表中的一列(比如areas),我想获取每辆车的区域名称:

select name from areas
where id = areaId

如何建立一个包含所有带有区域名称的汽车的列表?
天真的方法是query每个对象的数据库:

const query = `select name from areas
                 where id = $1`;
return pg.query(query, car.areaId);

但似乎要执行很多查询。

【问题讨论】:

  • 有点不清楚您在问什么:您是否有一个带有名称的“汽车”表和一个带有名称的“区域”表,并且您希望您的结果可能具有:@ 987654329@, car.name, area.name?

标签: javascript sql node.js postgresql


【解决方案1】:

你应该可以同时选择多个ID。

SELECT name
FROM areas
where ID in (5263, 5625, 5628, 5621) 

【讨论】:

  • 它是否按照请求的顺序返回值?
  • 我不完全确定默认是否遵循顺序,但您应该也可以在选择中请求 ID,然后按 ID 排序。
【解决方案2】:

是的,您可以指定多个car.ids 并获取car.namearea.name 并将它们一起返回。

您还可以使用ORDER BYcar.id 对响应进行排序。我不知道有什么方法可以根据传入的 IDS 的顺序来强制执行排序,但是您可以使用 JavaScript 轻松快速地对内存中的结果进行排序。

在 SQL 中有多种方法可以做到这一点:内连接、全连接、子选择……也许还有更多。我将演示“内连接”,因为它通常是最有效的,并且一些 SQL 查询规划器无论如何都会将子选择转换为内连接。

您尚未指定,但假设您使用的是node-postgres...当carIds 已定义为数组时,这是一个答案:

内连接

const query = `SELECT car.id, car.name, areas.name FROM car INNER JOIN area ON car.areaId WHERE car.id = ANY (${carIds}) ORDER BY car.id`

最后:

return pq.query(query, carIds)    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-14
    • 2022-12-10
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    相关资源
    最近更新 更多