Writeable CTE Not Working?

From: Kong Man <kong_mansatiansin(at)hotmail(dot)com>
To: <pgsql-sql(at)postgresql(dot)org>
Subject: Writeable CTE Not Working?
Date: 2013-01-29 02:32:51
Message-ID: DUB116-W6555FD44F7B4D966C07B48B1F0@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql


Can someone explain how this writable CTE works? Or does it not?

What I tried to do was to make those non-null/non-empty values of suppliers.suppliercode unique by (1) nullifying any blank, but non-null, suppliercode, then (2) appending the supplierid values to the suppliercode values for those duplicates. The writeable CTE, upd_code, did not appear to work, allowing the final UPDATE statement to, unexpectedly, fill what used to be empty values with '-'||suppliercode.

WITH upd_code AS (
UPDATE suppliers SET suppliercode = NULL
WHERE suppliercode IS NOT NULL
AND length(trim(suppliercode)) = 0
)
, ranked_on_code AS (
SELECT supplierid
, trim(suppliercode)||'-'||supplierid AS new_code
, rank() OVER (PARTITION BY upper(trim(suppliercode)) ORDER BY supplierid)
FROM suppliers
WHERE suppliercode IS NOT NULL
AND NOT inactive AND type != 'car'
)
UPDATE suppliers
SET suppliercode = new_code
FROM ranked_on_code
WHERE suppliers.supplierid = ranked_on_code.supplierid
AND rank > 1;

I have seen similar behavior in the past and could not explain it. Any explanation is much appreciated.
Thanks,
-Kong

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Виктор Егоров 2013-01-29 07:40:20 Re: Writeable CTE Not Working?
Previous Message Tom Lane 2013-01-24 01:42:47 Re: How to access multicolumn function results?