Вставка SQL в оператор приводит к странному (декартову произведению) результату - PullRequest
0 голосов
/ 11 декабря 2018

Я использую PostgreSQL 11 и PostGIS 2.5.1 и пытаюсь создать новый столбец в существующей таблице с конкретным значением

. Пример таблицы следующий:

 CREATE TABLE test (id integer, geom GEOMETRY);

INSERT INTO test (id, geom)
VALUES 
(1, ST_GeomFromEWKT('SRID=4326;POINT(-71.00 42.00)')),
(2, ST_GeomFromEWKT('SRID=4326;POINT(52.00 52.00)'));

Если я создаю новый столбец и выполняю вставку в оператор, результат будет похож на декартово произведение

ALTER Table test
ADD wkt_text TEXT;


INSERT INTO test (wkt_text)
SELECT st_astext(a.geom)::text FROM test a, test b
WHERE a.id = b.id;

Результат будет выглядеть следующим образом:

SELECT * FROM test;
 id |                        geom                        |   wkt_text    
----+----------------------------------------------------+---------------
  1 | 0101000020E61000000000000000C051C00000000000004540 | 
  2 | 0101000020E61000000000000000004A400000000000004A40 | 
    |                                                    | POINT(-71 42)
    |                                                    | POINT(52 52)

По какой причине это происходит?Вставка в работает без проблем на таблицах с пустыми столбцами.Как только столбец заполнится значениями, результат будет таким, как описано.

Я получил правильный результат при следующем запросе, но хочу понять, почему.

WITH subquery AS (
    SELECT id, st_astext(geom)::text AS wkt_text
    FROM test 
)
UPDATE test
SET wkt_text=subquery.wkt_text
FROM subquery
WHERE test.id = subquery.id;

1 Ответ

0 голосов
/ 11 декабря 2018

INSERT вставляет новые строки в таблицу.Столбцам, не указанным в INSERT, присваиваются значения NULL (или указанные значения по умолчанию).

UPDATE обновляет столбцы в существующих строках.Кажется, это логика, которую вы хотите, и у вас есть правильное утверждение для нее.

...