我有photos
表,我试图通过使用WHERE
子句过滤数据从另一个表中插入新列。这是我正在尝试执行的查询:
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。
答案 0 :(得分:2)
使用c
子句加入引用的表FROM
。
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
相关的子查询(如demonstrated by @Andomar)通常较慢,并且它们还具有副作用,这通常是不受欢迎的:
如果在c
中找不到匹配的行,UPDATE
将继续进行,new_count
将设置为NULL。在这种特殊情况下,这恰好是没有错误(因为根据案例的定义,列是NULL)。它仍然是毫无意义的额外成本。但是,这种影响往往是有害的。
如果新值与旧值没有区别,则添加的条件AND c.cnt IS NOT NULL
进一步避免了空更新。如果c.cnt
不能为NULL,则无用。它是通用支票的简化形式:AND c.cnt IS DISTINCT FROM p.new_count
。细节(最后一段):
答案 1 :(得分:1)
使用insert
向表中添加行,使用update
更改现有行。以下是如何根据photos
表的链接更新c
中的列的示例:
update photos p
set new_count =
(
select cnt
from c
where c.created = p.created
)