如何将左连接的右侧添加为PostgreSQL中的另一个“列”(nodeJS?)

uqcuzwp8  于 2022-12-12  发布在  Node.js
关注(0)|答案(1)|浏览(97)

我不知道这有多大可能,因为我没有接受过太多正式的PostgreSQL培训。我可以做大多数事情,然后用谷歌搜索剩下的。但是我不知道如何表达我想做的事情,所以我还没有找到任何东西。我可能只是用Javascript来做多个查询,并以这种方式连接它们,但我觉得有一个更好的方法。
目前在我对数据库的查询中,我有一些表的外键指向其他表中的行的id。一个简单的1对1关系,所以我目前一直在用一个简单的左连接进行测试。
但这要求我将右侧行的列添加为左侧的别名列。
例如,当我的数据返回到NodeJs应用时,它可能看起来像这样:
[{id:1,名称:'blah',其他表标识:2、其他_表_名:'blah blah',其他_表_日期:'2022年12月12日'}]
我希望它看起来更像:
[{'id':1,名称:'blah'、'其他数据表识别码':2、'其他_表':{“id”:2,名称:“blah blah”,日期:“2022年12月12日”}}]
这是否可以通过查询语句来实现?如果可以,我将如何实现它?
P.S.不确定它是否相关,但我正在使用库节点postgres进行查询。
如前所述,我目前只知道如何让我的数据回到格式:
[{id:1,名称:'blah',其他表标识:2、其他_表_名:'blah blah',其他_表_日期:'2022年12月12日'}]
我正在使用以下格式进行查询:
SELECT table1.id,table1.name,表1.其他表标识,table2.name AS其他表名称... FROM表1左联接表2 ON(表1.其他表标识= table2.id)ORDER BY table1.name
我希望它的格式为:
[{'id':1,名称:'blah'、'其他数据表识别码':2、'其他_表':{“id”:2,名称:“blah blah”,日期:“2022年12月12日”}}]
在基本情况下,格式将简化为如下格式?(这不是法律的的SQL):
SELECT表1.*,表2 AS表1.表2 FROM表1左联接表2 ON(表1.其他表标识= table2.id)ORDER BY table1.name
只是不知道怎么做。

hs1ihplo

hs1ihplo1#

我更喜欢在应用程序内部进行数据转换,而不是在SQL/数据库中进行,因为如果你想的话,将来更改数据库会更容易。
但是,为了帮助你解决这个特定的问题,使用PostgreSQL的json_build_object和json_build_array函数来执行下面的查询语句。你可以使用这两个函数来生成你想要的JSON输出:

SELECT
  table1.id,
  table1.name,
  json_build_object(
    'id', table2.id,
    'name', table2.name,
    'date', table2.date
  ) AS other_table
FROM table1
LEFT JOIN table2 ON (table1.other_table_id = table2.id)
ORDER BY table1.name

这将生成如下所示的输出:

[
  {
    "id": 1,
    "name": "blah",
    "other_table": { "id": 2, "name": "blah blah", "date": "12-12-2022" }
  }
]

如果要以数组的形式获取输出,请使用以下语句更改查询:

json_build_array(
    json_build_object(
      'id', table2.id,
      'name', table2.name,
      'date', table2.date
    )
  ) AS other_table

我在postgresql文档中获得了以下信息:
https://www.postgresql.org/docs/current/functions-json.html#FUNCTIONS-JSON-PROCESSING-TABLE
https://www.postgresql.org/docs/current/functions-json.html#FUNCTIONS-JSON-BUILDING-ARRAYS-TABLE
显然,这是一种折衷,但请记住,现在您的应用程序与数据库紧密耦合。

相关问题