将一列从一个 table 复制到另一个
Copying a column from one table to another
我有 photos
table,我试图通过使用 WHERE
子句过滤数据从另一个 table 插入一个新列。这是我要执行的查询:
ALTER TABLE photos ADD COLUMN new_count BIGINT;
INSERT INTO photos (new_count)
SELECT c.cnt
FROM c
WHERE
c.created = photos.created;
但结果出现错误:
Error : ERROR: invalid reference to FROM-clause entry for table "photos"
LINE 5: c.created = photos.created
如何避免错误并复制列?
我正在使用 PostgreSQL 9.4。
使用 insert
将行添加到 table,使用 update
更改现有行。这是一个示例,说明如何根据 link 将 photos
中的列更新为 c
table:
update photos p
set new_count =
(
select cnt
from c
where c.created = p.created
)
使用 FROM
子句加入引用的 table c
。
UPDATE photos p
SET new_count = c.cnt
FROM c
WHERE c.created = p.created
AND c.cnt IS NOT NULL; -- optional, depends on additional circumstances
相关子查询(如 )通常较慢,并且它们还有一个 副作用,这通常是不可取的:
如果在 c
中找不到匹配的行,则 UPDATE
将继续执行,并且 new_count
将设置为 NULL。在这种特殊情况下,这恰好 没有错 (因为根据该情况的定义,该列为 NULL)。这仍然是毫无意义的额外费用。不过,这种影响通常是有害的。
添加的条件AND c.cnt IS NOT NULL
进一步避免了新值与旧值没有区别时的空更新。如果 c.cnt
不能为 NULL,则无用。这是通用检查的简化形式:AND c.cnt IS DISTINCT FROM p.new_count
。详情(最后一段):
- How do I (or can I) SELECT DISTINCT on multiple columns?
我有 photos
table,我试图通过使用 WHERE
子句过滤数据从另一个 table 插入一个新列。这是我要执行的查询:
ALTER TABLE photos ADD COLUMN new_count BIGINT;
INSERT INTO photos (new_count)
SELECT c.cnt
FROM c
WHERE
c.created = photos.created;
但结果出现错误:
Error : ERROR: invalid reference to FROM-clause entry for table "photos"
LINE 5: c.created = photos.created
如何避免错误并复制列?
我正在使用 PostgreSQL 9.4。
使用 insert
将行添加到 table,使用 update
更改现有行。这是一个示例,说明如何根据 link 将 photos
中的列更新为 c
table:
update photos p
set new_count =
(
select cnt
from c
where c.created = p.created
)
使用 FROM
子句加入引用的 table c
。
UPDATE photos p
SET new_count = c.cnt
FROM c
WHERE c.created = p.created
AND c.cnt IS NOT NULL; -- optional, depends on additional circumstances
相关子查询(如
如果在 c
中找不到匹配的行,则 UPDATE
将继续执行,并且 new_count
将设置为 NULL。在这种特殊情况下,这恰好 没有错 (因为根据该情况的定义,该列为 NULL)。这仍然是毫无意义的额外费用。不过,这种影响通常是有害的。
添加的条件AND c.cnt IS NOT NULL
进一步避免了新值与旧值没有区别时的空更新。如果 c.cnt
不能为 NULL,则无用。这是通用检查的简化形式:AND c.cnt IS DISTINCT FROM p.new_count
。详情(最后一段):
- How do I (or can I) SELECT DISTINCT on multiple columns?