我正在使用PostgreSQL 10.5,并且具有以下SQL:
FOR temprow IN
SELECT o.objectid, o.nametag, cor.userseqno, cor.commseqno
FROM "commuserobjectrights" as cor
LEFT JOIN "object" as o ON cor.objectid = o.objectid
WHERE o.nametag LIKE 'commission.video_questions'
LOOP
INSERT INTO u commuserobjectrights (objectid, commseqno, userseqno, access)
VALUES (temprow.objectid, temprow.commseqno, temprow.userseqno, TRUE);
END LOOP;
会引发以下错误:
ERROR: syntax error at or near "FOR" Position: 3
我以前从未使用过循环,但是根据文档,postgresql应该支持这些类型的循环。是的,我检查并仔细检查了所有表和列的名称是否正确拼写。
答案 0 :(得分:4)
您不能在程序代码之外使用FOR
循环。但是,一般而言,Postgres(和SQL)已经过优化,可以执行基于集合的操作。因此,您可以将其表达为INSERT INTO ... SELECT
:
INSERT INTO commuserobjectrights (objectid, commseqno, userseqno, access)
SELECT o.objectid, o.nametag, cor.userseqno, TRUE
FROM "commuserobjectrights" as cor
LEFT JOIN "object" as o ON cor.objectid = o.objectid
WHERE o.nametag LIKE 'commission.video_questions';
答案 1 :(得分:0)
FOR
是程序代码,您需要使用DO
或在存储的代码中使用它。
DO $$
DECLARE
temprow record ;
BEGIN
FOR temprow IN
SELECT o.objectid, o.nametag, cor.userseqno, cor.commseqno
FROM "commuserobjectrights" as cor
LEFT JOIN "object" as o ON cor.objectid = o.objectid
WHERE o.nametag LIKE 'commission.video_questions'
LOOP
INSERT INTO commuserobjectrights (objectid, commseqno, userseqno, access)
VALUES (temprow.objectid, temprow.commseqno, temprow.userseqno, TRUE);
END LOOP;
END;
$$;
这不是执行此任务的最有效方法,但是对于其他您不能轻松编写SQL DO的任务可能会有用。