【问题标题】:SQL insert into statement leads to weird (cartesian product) resultSQL插入语句导致奇怪的(笛卡尔积)结果
【发布时间】:2018-12-11 11:28:58
【问题描述】:

我正在使用 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)'));

如果我创建一个新列并执行 insert into 语句,结果就像一个笛卡尔积

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;

【问题讨论】:

    标签: sql postgresql sql-insert


    【解决方案1】:

    INSERT 将新的 插入到表中。 INSERT 中未指定的列将被赋予 NULL 值(或指定的默认值)。

    UPDATE 更新现有行中的列。这似乎是您想要的逻辑,并且您有正确的陈述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多