UPDATE statement with multiple joins in PostgreSQL

前端 未结 5 1802
说谎
说谎 2021-01-07 18:16

I\'m trying to update a table called incode_warrants and set the warn_docket_no to the viol_docket_no from the incode_violations

相关标签:
5条回答
  • 2021-01-07 18:39
    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;
    
    0 讨论(0)
  • 2021-01-07 18:52

    That is my code, i generate my join and enclosure in a and after join with my updateable table and in my where i compare my identitys, sorry for my english

    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;
    
    0 讨论(0)
  • 2021-01-07 18:54

    Your update a table, not the join

    update incode_warrants ALIAS
    set warn_docket_no = iv.viol_docket_no
    from incode_warrantvs as iw 
    ...
    
    0 讨论(0)
  • 2021-01-07 18:55

    Your query should look like this:

    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;
    

    You don't need any other join. With this query you just update a column in one table with values from a column from another table. Of course, it updates only when WHERE condition is true.

    0 讨论(0)
  • 2021-01-07 18:59

    The same as valid UPDATE statement in Postgres:

    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;
    -- AND iw.warn_docket_no IS DISTINCT FROM iv.viol_docket_no -- see below
    

    You cannot just use a table alias in the FROM clause as target table in the UPDATE clause. The (one!) table to be updated comes right after UPDATE keyword (if we ignore a possible ONLY keyword in between). You can add an alias there if you want. That's the immediate cause of your error message, but there's more.

    The column to be updated is always from the one table to be updated and cannot be table-qualified.

    You don't need to repeat the target table in the FROM clause - except for special cases like this:

    • PostgreSQL: update with left outer self join ignored

    This optional addition can avoid pointless cost by suppressing updates that do not change anything:

    AND iw.warn_docket_no IS DISTINCT FROM iv.viol_docket_no
    

    See:

    • How do I (or can I) SELECT DISTINCT on multiple columns?

    More in the excellent manual on UPDATE.

    0 讨论(0)
提交回复
热议问题