PostgreSQL中有多个连接的UPDATE语句

时间:2015-09-03 22:12:16

标签: sql postgresql sql-update inner-join

我尝试更新名为import java.io.*; String msg = "From:sender@em.ail\r\nTo:my@em.ail\r\nSubject:Test Mail\r\n\r\nBLAH BLAH BLAH\r\n.\r\n"; Process p = Runtime.getRuntime().exec(mail); PrintWriter pw = new PrintWriter(p.getOutputStream()); pw.println(msg); pw.flush(); pw.close(); 的表格,并将incode_warrants设置为warn_docket_no表格中的viol_docket_no

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

incode_violations

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

Error : ERROR:  relation "iw" does not exist
LINE 1: update iw

5 个答案:

答案 0 :(得分:28)

与Postgres中的有效'ViewFeedStrategy'语句相同:

'ViewFeedStratagy'

您不能仅将UPDATE子句中的表别名用作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; 子句中的目标表。要更新的(one!)表就在FROM之后。如果需要,可以在那里添加别名。这是您的错误消息的直接原因,但还有更多。

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

您不需要在UPDATE子句中重复目标表。

All of that and more in the excellent manual.

答案 1 :(得分:4)

您的查询应如下所示:

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;

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

答案 2 :(得分:1)

您更新了表格,而不是加入

update incode_warrants ALIAS
set warn_docket_no = iv.viol_docket_no
from incode_warrantvs as iw 
...

答案 3 :(得分:1)

那是我的代码,我在一个中生成我的联接和附件,并在与我的可更新表联接之后,在我比较自己的身份的地方,对不起我的英语

update cs_ticket ct
set site_name = a.name
from (
    select ct.id, cs."name" 
    from cs_ticket ct 
    inner join cs_net_segment cns 
    on ct.affected_ip like cns.ip || '.%'
    and end_date is null
    inner join cs_site cs 
    on cs.id = cns.site_id)a
where ct.id = a.id;

答案 4 :(得分:0)

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;