On 10 August 2017 at 14:33, Hellmuth Vargas <hiv...@gmail.com> wrote:
>
> Hola Lista
>
> Estaba revisando porque unas sentencias se ejecutaban y otras no con WITH y
> prepare este script para que ustedes me ayuden a entender:
>

Acabo de ver tu correo y me parecía un comportamiento extraño pero
conocido. La documentación señala lo que muestras en este párrafo de
https://www.postgresql.org/docs/9.6/static/sql-select.html#SQL-WITH
"""
The primary query and the WITH queries are all (notionally) executed
at the same time. This implies that the effects of a data-modifying
statement in WITH cannot be seen from other parts of the query, other
than by reading its RETURNING output. If two such data-modifying
statements attempt to modify the same row, the results are
unspecified.
"""

En otras palabras que durante la ejecución de la consulta, no verás
los cambios reflejados en las tablas finales sino sólo en las tablas
temporales (que se forman por la inclusión de la clausula returning)
que forman parte del WITH (en tu caso, la consulta principal debería
hacer referencia a base y a hijos)

por lo que, al menos en el primer ejercicio que mostraste, la consulta
debería ser así:
"""
with base  as(insert into padre(id,texto) select a.dato,chr(dato) from
generate_series(33,255,1) as a(dato) returning id,texto),
     hijos as (insert into hijo(id, texto, padre_id) select -a.id,'el
char de ' || a.id || 'es: ' || texto,a.id from base as a returning *)
select * from base as a join hijos as b on a.id=b.padre_id;
"""

PD: por favor, cuando copies una consulta evita pegar el prompt
(test=# en tu caso). sólo probe con la primera consulta porque no
tenía intenciones de limpiar las otras consultas para poderlas
ejecutar.

-- 
Jaime Casanova                      www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Reply via email to