Re: UPDATE from CTE syntax error

From: Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com>
To: Alexander Farber <alexander(dot)farber(at)gmail(dot)com>, pgsql-general <pgsql-general(at)postgresql(dot)org>
Subject: Re: UPDATE from CTE syntax error
Date: 2018-05-26 16:37:22
Message-ID: ca819b5d-0cbf-0c72-2e96-99561c624fda@aklaver.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 05/26/2018 09:21 AM, Alexander Farber wrote:
> Good evening,
>
> I am struggling with the syntax, please help.
>
> This query with a CTE works ok:
>
> WITH
>
>              extract_letters AS (
>
>                                    SELECT
>
>                                                          mid,
>
>
>  STRING_AGG(x->>'letter', '') AS letters
>
>         FROM (
>
>                                SELECT
>
>                                                      mid,
>
>
>  JSONB_ARRAY_ELEMENTS(tiles) AS x
>
>        FROM words_moves
>
>                      WHERE action='play'
>
>                             ) z
>
> GROUP BY mid)
>
>       SELECT * from extract_letters;
>
>  mid   | letters
> --------+---------
>      12 | АКЖОЛ
>      15 | ДМО
>      16 | ТО
>      20 | ШГА
>      21 | КТИ
>      22 | ВОЗ
>      24 | АКПОНК
>
> But UPDATEing from the CTE does not -
>
> WITH extract_letters AS (
>
>                       SELECT
>
>                                              mid,
>
>
>  STRING_AGG(x->>'letter', '') AS letters
>
>         FROM (
>
>                                SELECT
>
>                                                      mid,
>
>
>  JSONB_ARRAY_ELEMENTS(tiles) AS x
>
>        FROM words_moves
>
>                      WHERE action='play'
>
>                             ) z
>
>                                   GROUP BY mid)
>
>          UPDATE words_moves m
>
>                        SET m.letters = el.letters

I would say the above is the problem:

https://www.postgresql.org/docs/10/static/sql-update.html
"column_name

The name of a column in the table named by table_name. The column
name can be qualified with a subfield name or array subscript, if
needed. Do not include the table's name in the specification of a target
column — for example, UPDATE table_name SET table_name.col = 1 is invalid.
"

So it should be:

SET letters = el.letters

>
>                                      FROM extract_letters el
>
>                                            WHERE m.mid = el.mid;
>
> ERROR:  42703: column "m" of relation "words_moves" does not exist
> LINE 14: SET m.letters = el.letters
>              ^
>
> Regards
> Alex

--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Adrian Klaver 2018-05-26 17:27:51 Re: Fast logical replication jump start with PG 10
Previous Message Alexander Farber 2018-05-26 16:22:00 Re: UPDATE from CTE syntax error