PostgreSQL中有多个连接的UPDATE语句

nul*_*tek 15 sql postgresql inner-join sql-update

我正在尝试更新一个名为的表incode_warrants,并将其设置warn_docket_noviol_docket_noincode_violations表中.

我在Postgres 9.3中有以下SQL查询,但是当它触发时我收到以下错误:

Error : ERROR:  relation "iw" does not exist
LINE 1: update iw
Run Code Online (Sandbox Code Playgroud)

我更像是一个活跃记录的人,所以我的原始SQL技能严重缺乏.我想知道是否有人可以帮助指出我正确的方向如何正确地进行此查询.

update iw
set iw.warn_docket_no = iv.viol_docket_no
from incode_warrants as iw
INNER JOIN incode_warrantvs as iwvs
on iw.warn_rid = iwvs.warnv_rid
INNER JOIN incode_violations as iv
ON iv.viol_citation_no = iwvs.warnv_citation_no and iv.viol_viol_no = iwvs.warnv_viol_no
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 40

UPDATEPostgres中的有效声明相同:

UPDATE incode_warrants iw
SET    warn_docket_no = iv.viol_docket_no
FROM   incode_warrantvs  iwvs
JOIN   incode_violations iv ON iv.viol_citation_no = iwvs.warnv_citation_no
                           AND iv.viol_viol_no = iwvs.warnv_viol_no
WHERE  iw.warn_rid = iwvs.warnv_rid;
Run Code Online (Sandbox Code Playgroud)

您不能只在FROM子句中使用表别名作为子句中的目标表UPDATE.要更新的(一个!)表就在之后UPDATE.如果需要,可以在那里添加别名.这是您的错误消息的直接原因,但还有更多.

要更新的列始终来自要更新的一个表,并且不能进行表限定.

您不需要在FROM子句中重复目标表.

所有这些以及更多优秀的手册.


Wal*_*zak 6

您的查询应如下所示:

UPDATE incode_warrants
SET warn_docket_no = incode_violations.viol_docket_no
FROM incode_violations
WHERE incode_violations.viol_citation_no = incode_warrants.warnv_citation_no
AND incode_violations.viol_viol_no = incode_warrants.warnv_viol_no;
Run Code Online (Sandbox Code Playgroud)

您不需要任何其他加入。使用此查询,您只需使用另一个表中的列中的值更新一个表中的列。当然,它只在WHERE条件为真时更新。


小智 6

UPDATE incode_warrants iw
     SET warn_docket_no = iv.viol_docket_no
FROM incode_warrantvs AS iwvs, incode_violations AS iv 
WHERE iv.viol_citation_no = iwvs.warnv_citation_no AND
      iv.viol_viol_no = iwvs.warnv_viol_no AND
      iw.warn_rid = iwvs.warnv_rid;
Run Code Online (Sandbox Code Playgroud)