如何从1个表中选择许多行并将其插入另一个表中特定行的特定JSONB字段中?但是在单个原始SQL查询中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从1个表中选择许多行并将其插入另一个表中特定行的特定JSONB字段中?但是在单个原始SQL查询中相关的知识,希望对你有一定的参考价值。

postgres 10.3

我在名为sites的表中大约有1000行

如果我这样查询

SELECT id, name from sites;

我将获得1000行。

我还有另一个名为jsonindexdocument的表,其中单行的id为1,而名为index的字段为JSONB

是否有可能在单个查询中删除网站表中的所有1000行,然后更新ID为1的index字段?

json的格式为

[
  {
     "id": 10,
     "name": "somename"
  },
  {
     "id": 11,
     "name": "another name"
  } // and the rest of the 1000 rows
]

如果使用多个原始SQL语句,我也可以。

答案

假设您可以完全替换index表中的jsonindexdocument值:

UPDATE jsonindexdocument
SET index = (
    -- using json_agg(row_to_json(sites.*)) would also work here, if you want to copy
    -- all columns from the sites table into the json value
    SELECT json_agg(json_build_object(
        'id', id,
        'name', name
    ))
    FROM sites
)
WHERE id = 1;

例如:

CREATE TEMP TABLE sites (
    id   INT,
    name TEXT
);

CREATE TEMP TABLE jsonindexdocument (
    id    INT,
    index JSON
);

INSERT INTO sites
VALUES (1, 'name1')
     , (2, 'name2');

INSERT INTO jsonindexdocument
VALUES (1, NULL);

UPDATE jsonindexdocument
SET index = (
    SELECT json_agg(json_build_object(
        'id', id,
        'name', name
    ))
    FROM sites
)
WHERE id = 1;

SELECT * FROM jsonindexdocument;

返回

+--+------------------------------------------------------------+
|id|index                                                       |
+--+------------------------------------------------------------+
|1 |[{"id" : 1, "name" : "name1"}, {"id" : 2, "name" : "name2"}]|
+--+------------------------------------------------------------+

以上是关于如何从1个表中选择许多行并将其插入另一个表中特定行的特定JSONB字段中?但是在单个原始SQL查询中的主要内容,如果未能解决你的问题,请参考以下文章

从一个表中选择行并插入到另一个表中

如何根据一个表中的特定值从3个表中删除行[重复]

如何使用'$row'将一个数据库表中的特定值插入到另一个数据库表中?

MySQL从一个表中选择行,第二个表中有多行,并在所选行中获取多行数组

如何使用 laravel 集合获取最后插入的 ID 并将其插入到第二个表中?

如何从一个表中选择不在其他表中的所有行?