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:
test=# create table padre(id int primary key, texto text); CREATE TABLE test=# create table hijo(id int primary key, texto text, padre_id int references padre(id)); CREATE TABLE test=# begin transaction; BEGIN test=# with base as( test(# insert into padre(id,texto) test(# select a.dato,chr(dato) from generate_series(33,255,1) as a(dato) returning id,texto test(# ),hijos as ( test(# insert into hijo(id, texto, padre_id) test(# select -a.id,'el char de ' || a.id || 'es: ' || texto,a.id from base as a test(# ) test-# select * from test-# padre as a test-# join hijo as b on a.id=b.padre_id; id | texto | id | texto | padre_id ----+-------+----+-------+---------- (0 rows) no sale nada pero si en la misma transacción ejecuto nuevamente el ultimo select: test=# select * from test-# padre as a test-# join hijo as b on a.id=b.padre_id; id | texto | id | texto | padre_id -----+--------+------+--------------------------+---------- 33 | ! | -33 | el char de 33es: ! | 33 34 | " | -34 | el char de 34es: " | 34 35 | # | -35 | el char de 35es: # | 35 36 | $ | -36 | el char de 36es: $ | 36 37 | % | -37 | el char de 37es: % | 37 38 | & | -38 | el char de 38es: & | 38 39 | ' | -39 | el char de 39es: ' | 39 40 | ( | -40 | el char de 40es: ( | 40 41 | ) | -41 | el char de 41es: ) | 41 42 | * | -42 | el char de 42es: * | 42 43 | + | -43 | el char de 43es: + | 43 44 | , | -44 | el char de 44es: , | 44 45 | - | -45 | el char de 45es: - | 45 46 | . | -46 | el char de 46es: . | 46 47 | / | -47 | el char de 47es: / | 47 48 | 0 | -48 | el char de 48es: 0 | 48 49 | 1 | -49 | el char de 49es: 1 | 49 50 | 2 | -50 | el char de 50es: 2 | 50 51 | 3 | -51 | el char de 51es: 3 | 51 52 | 4 | -52 | el char de 52es: 4 | 52 53 | 5 | -53 | el char de 53es: 5 | 53 54 | 6 | -54 | el char de 54es: 6 | 54 55 | 7 | -55 | el char de 55es: 7 | 55 56 | 8 | -56 | el char de 56es: 8 | 56 test=# rollback; ROLLBACK ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- test=# begin transaction; BEGIN test=# with base as( test(# insert into padre(id,texto) test(# select a.dato,chr(dato) from generate_series(33,255,1) as a(dato) returning id,texto test(# ),hijos as ( test(# insert into hijo(id, texto, padre_id) test(# select -a.id,'el char de ' || a.id || 'es: ' || texto,a.id from padre as a ---no inserta test(# ) test-# select * from test-# padre as a test-# join hijo as b on a.id=b.padre_id; id | texto | id | texto | padre_id ----+-------+----+-------+---------- (0 rows) No inserto en el hijo. test=# select * from test-# padre as a test-# join hijo as b on a.id=b.padre_id; id | texto | id | texto | padre_id ----+-------+----+-------+---------- (0 rows) test=# select * from padre; id | texto -----+-------- 33 | ! 34 | " 35 | # 36 | $ 37 | % 38 | & 39 | ' 40 | ( 41 | ) 42 | * 43 | + 44 | , 45 | - 46 | . 47 | / 48 | 0 49 | 1 50 | 2 51 | 3 52 | 4 53 | 5 54 | 6 55 | 7 56 | 8 test=# select * from hijo; id | texto | padre_id ----+-------+---------- (0 rows) test=# rollback; ROLLBACK ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- test=# begin transaction; BEGIN test=# insert into padre(id,texto) test-# select a.dato,chr(dato) from generate_series(33,255,1) as a(dato); INSERT 0 223 test=# test=# with elimina as ( test(# delete from padre where id%2=0 returning id,texto test(# ),hijos as ( test(# insert into hijo(id, texto, padre_id) test(# select -a.id,'el char de ' || a.id || 'es: ' || a.texto,a.id from padre as a returning id, texto, padre_id test(# ) test-# select * from test-# hijos as b; ERROR: insert or update on table "hijo" violates foreign key constraint "hijo_padre_id_fkey" DETAIL: Key (padre_id)=(34) is not present in table "padre". ok aunque en hijos emplee la tabla padre. test=# test=# rollback; ROLLBACK ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- test=# begin transaction; BEGIN test=# with base as( test(# insert into padre(id,texto) test(# select a.dato,chr(dato) from generate_series(33,255,1) as a(dato) returning id,texto test(# ),hijos as ( test(# insert into hijo(id, texto, padre_id) test(# select -a.id,'el char de ' || a.id || 'es: ' || texto,a.id from padre as a ---no inserta test(# ) test-# select * from test-# padre as a test-# join hijo as b on a.id=b.padre_id; id | texto | id | texto | padre_id ----+-------+----+-------+---------- (0 rows) aquí no ve los registros de la tabla padre que se habían insertado en base..... test=# select * from hijo; id | texto | padre_id ----+-------+---------- (0 rows) test=# select * from padre; id | texto -----+-------- 33 | ! 34 | " 35 | # 36 | $ 37 | % 38 | & 39 | ' 40 | ( 41 | ) 42 | * 43 | + 44 | , 45 | - 46 | . 47 | / 48 | 0 49 | 1 50 | 2 51 | 3 52 | 4 53 | 5 54 | 6 55 | 7 56 | 8 test=# test=# rollback; ROLLBACK -- Cordialmente, Ing. Hellmuth I. Vargas S. Esp. Telemática y Negocios por Internet