Re: [GENERAL] No funciona WITH con mas de 2 sentencias DML

From: Hellmuth Vargas <hivs77(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, Lista Postgres ES <pgsql-es-ayuda(at)postgresql(dot)org>
Cc: Francisco Olarte <folarte(at)peoplecall(dot)com>
Subject: Re: [GENERAL] No funciona WITH con mas de 2 sentencias DML
Date: 2015-10-06 17:26:26
Message-ID: CAN3Qy4q-ceh0k6+=exLkeZS8r=7kAfJrzgLHqxOh_wPOT1-HmQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda pgsql-general

Hola Alvaro

Gracias por la pronta respuesta

Alvaro Herrera wrote:
Hmm, yo creo que sí funciona y no lo estás usando bien. No tengo tiempo
ahora para mirar tu query, pero me parece raro que en el FROM no hagas
referencia a insertadetalle, y también me parece raro que hagas
referencia directa a maestro cuando deberías hacerlo a base.

Lo hice de varias formas:
1. empleando el resultado de insertadetalle
2. con base solo y
3. con base haciendo join con maestro

Realice este pequeño laboratorio para presentar la inquietud:

create table carga (
identificacion text,nombre text,tarjeta text, telefono text
);

insert into carga(identificacion ,nombre ,tarjeta , telefono)
values
('1','Juan', 'tarjeta 1', '1234'),
('1','Juan', 'tarjeta 2', '1234'),
('2','German', 'tarjeta 1', '5678'),
('3','Pedro', 'tarjeta 1', '90123'),
('3','Pedro', 'tarjeta 2', '90123');

create table master (
id serial primary key,
identificacion text,nombre text, telefono text
);

create table detalle (
id serial,
tarjeta text,
master_id int references master(id)
);

create table marcadortelefonia (
id serial,
telefono text,
master_id int references master(id)
);

WITH base AS (
INSERT INTO master (identificacion,nombre, telefono)
SELECT a.identificacion,a.nombre,a.telefono
FROM carga as a
GROUP BY a.identificacion,a.nombre,a.telefono
RETURNING id,identificacion

)
, insertadetalle AS (
INSERT INTO detalle(tarjeta,master_id)
SELECT a.tarjeta,b.id
FROM carga as a
JOIN base as b on a.identificacion=b.identificacion
RETURNING master_id

)
INSERT INTO
marcadortelefonia
(
telefono,
master_id
)
SELECT
b.telefono,
a.id
*FROM base as a join master as b on a.id <http://a.id>=b.id <http://b.id>*
group by b.telefono,a.id;

select count(*) from master; -- 3 registros
select count(*) from detalle; -- 5 registros
select count(*) from marcadortelefonia; -- 0 registros

---------------------
-- version 2
---------------------

WITH base AS (
INSERT INTO master (identificacion,nombre, telefono)
SELECT a.identificacion,a.nombre,a.telefono
FROM carga as a
GROUP BY a.identificacion,a.nombre,a.telefono
RETURNING id,identificacion

)
, insertadetalle AS (
INSERT INTO detalle(tarjeta,master_id)
SELECT a.tarjeta,b.id
FROM carga as a
JOIN base as b on a.identificacion=b.identificacion
RETURNING master_id

)
INSERT INTO
marcadortelefonia
(
telefono,
master_id
)
SELECT
b.telefono,
a.master_id
*FROM insertadetalle as a join master as b on a.master_id=b.id
<http://b.id>*
group by b.telefono,a.master_id;

select count(*) from master; -- 3 registros
select count(*) from detalle; -- 5 registros
select count(*) from marcadortelefonia; -- 0 registros

Muchas gracias!!

El 6 de octubre de 2015, 11:11 a. m., Alvaro Herrera<alvherre(at)alvh(dot)no-ip(dot)org
> escribió:

> Francisco Olarte wrote:
> > Alvaro, Hellmuth no se si os habies dado cuenta pero estais copiando
> > mensaje entre la lista en Español y la general ( es posible que si
> > teneis las dos suscritas os haya eliminado los duplicados, yo solo
> > tengo la -general en ingles y me han llegado )
> >
> > ( Intencionalmente sin copia a las listas, solo FYI ).
>
> Ups, no me di cuenta :-(
>
> /me spanks Hellmuth
>
> Ya que estamos, aprovecho de decir que creo que serías un buen aporte a
> la lista en español :-)
>
> Saludos
>
> > 2015-10-06 17:51 GMT+02:00 Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>:
> > > Hellmuth Vargas escribió:
> > >> Hola Lista
> > >>
> > >> Estaba realizando un cargue de un archivo Excel con información de
> clientes
> > .....
> > > Hmm, yo creo que sí funciona y no lo estás usando bien. No tengo
> tiempo
> > > ahora para mirar tu query, pero me parece raro que en el FROM no hagas
> > ........
>
>
> --
> Álvaro Herrera PostgreSQL Expert,
> http://www.2ndQuadrant.com/
> "Oh, great altar of passive entertainment, bestow upon me thy discordant
> images
> at such speed as to render linear thought impossible" (Calvin a la TV)
>

--
Cordialmente,

Ing. Hellmuth I. Vargas S.
Esp. Telemática y Negocios por Internet
Oracle Database 10g Administrator Certified Associate
EnterpriseDB Certified PostgreSQL 9.3 Associate

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Gustavo Borchez 2015-10-06 17:41:02 Auditoría y evaluación
Previous Message Alvaro Herrera 2015-10-06 15:51:23 Re: [pgsql-es-ayuda] No funciona WITH con mas de 2 sentencias DML

Browse pgsql-general by date

  From Date Subject
Next Message John R Pierce 2015-10-06 17:29:40 Re: Recording exceptions within function (autonomous transactions?)
Previous Message Olivier Dony 2015-10-06 17:18:36 Re: Serialization errors despite KEY SHARE/NO KEY UPDATE