Как выбрать много строк из 1 таблицы и вставить в указанное c JSONB поле указанной c строки в другой таблице? Но в одном необработанном запросе SQL - PullRequest
2 голосов
/ 30 мая 2020

postgres 10,3

У меня около 1000 строк внутри таблицы с именем sites

Если я запрошу вот так

SELECT id, name from sites;

, я получу 1000 строк.

У меня также есть другая таблица с именем jsonindexdocument с одной строкой, где идентификатор равен 1, и поле с именем index, которое является JSONB

Возможно ли, что в одном запросе Я беру все 1000 строк в таблице сайтов, а затем обновляю поле с именем index под идентификатором 1?

Формат json будет

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

Я тоже хорошо, если он использует более 1 необработанного оператора SQL.

UPDATE

Я хочу добавить, что если результат пустой, то по умолчанию будет пустой массив в поле json

1 Ответ

2 голосов
/ 30 мая 2020

Если вы согласны полностью заменить значение 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 COALESCE(json_agg(json_build_object(
        'id', id,
        'name', name
    )), '[]'::json)
    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 COALESCE(json_agg(json_build_object(
        'id', id,
        'name', name
    )), '[]'::json)
    FROM sites
)
WHERE id = 1;

SELECT * FROM jsonindexdocument;

возвращает

+--+------------------------------------------------------------+
|id|index                                                       |
+--+------------------------------------------------------------+
|1 |[{"id" : 1, "name" : "name1"}, {"id" : 2, "name" : "name2"}]|
+--+------------------------------------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...