No funciona WITH con mas de 2 sentencias DML

Started by Hellmuth Vargasover 10 years ago15 messagesgeneral
Jump to latest
#1Hellmuth Vargas
hivs77@gmail.com

Hola Lista

Estaba realizando un cargue de un archivo Excel con información de clientes
bancarios con tarjeta para un call center poblando un modelo maestro,
detalle y tabla de llamadas telefónicas. En un principio se implemento por
medio de una herramienta de ETL con los controles que ofrece la herramienta
ETL y para bases de 10.000 registros duraba hasta 3 horas si no se caída
por memoria, por lo tanto me lo asignaron para optimizarlo y decidí
realizar las operaciones de ordenamiento, limpieza y filtro de datos
directamente en la base de datos (donde es natural) aun empleando el
cascaron de la herramienta de ETL (pues debe integrase con otro sistema);
dentro de uno de los pasos, ya para insertar los datos en las diferentes
tablas, implemente un código similar al siguiente empleando WITH:

WITH base AS (
INSERT INTO maestro (
fechacreacion, fechamodificacion, idusuariocrea,
departamento, documento, municipio, primerapellido,
primernombre, telefono1, tipodocumento, direccion, email)
SELECT now(), now(), 1,a.departamento ,a.documento,a.ciudad,
a.apellidos,a.nombres, a.telefono_1,
a.tipo_identificacion,a.direccion_residencia , a.e_mail
FROM tmp_carga
GROUP BY a.departamento ,a.documento,a.ciudad, a.apellidos,a.nombres,
a.telefono_1, a.tipo_identificacion,a.direccion_residencia , a.e_mail
RETURNING id,documento

), insertadetalle AS (
INSERT INTO detalle(
codigooficina,
direccionoficina, franquicia, montodisponible, nombreproducto,
tipoproducto, ultimosdigitos, maestro_id)

SELECT a.Codigo_Interno,
a.Cod_Oficina,a.DireccionOficina,a.Franquicia_tarjeta, a.MontoDisponible,
a.Nombre_Producto,a.Tipo_Producto,a.ultimos_digitos_tc,b.id
FROM vys.tmp_carga as a
JOIN base as b on a.documento=b.documento
RETURNING maestro_id

)
INSERT INTO
marcadortelefonia
(
numerointento,
telefono,
telefono2,
telefono3,
telefono4,
fechacreacion,
maestro_id,
calificacion
)
SELECT
1,
a.telefono1,
a.telefono2,
a.telefono3,
a.telefono4,
current_timestamp,
a.id,
0
FROM
maestro as a
JOIN base as b --tambien probe sustituyendo base por insertadetalle y
tampoco
ON a.id=b.id

El tema es que no ejecuta el ultimo INSERT (sobre marcadortelefonia): si
inserta los datos en maestro y en detalle, pero cuando consulto sobre
marcadortelefonia no hay nada y tampoco genera error. En resumen, no sirve
emplear un WITH con mas de dos sentencias DML.? o estoy haciendo algo mal?
de antemano muchas gracias lista

Cordialmente,

Ing. Hellmuth I. Vargas S.

#2Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Hellmuth Vargas (#1)
Re: [pgsql-es-ayuda] No funciona WITH con mas de 2 sentencias DML

Hellmuth Vargas escribi�:

Hola Lista

Estaba realizando un cargue de un archivo Excel con informaci�n de clientes
bancarios con tarjeta para un call center poblando un modelo maestro,
detalle y tabla de llamadas telef�nicas. En un principio se implemento por
medio de una herramienta de ETL con los controles que ofrece la herramienta
ETL y para bases de 10.000 registros duraba hasta 3 horas si no se ca�da
por memoria, por lo tanto me lo asignaron para optimizarlo y decid�
realizar las operaciones de ordenamiento, limpieza y filtro de datos
directamente en la base de datos (donde es natural) aun empleando el
cascaron de la herramienta de ETL (pues debe integrase con otro sistema);
dentro de uno de los pasos, ya para insertar los datos en las diferentes
tablas, implemente un c�digo similar al siguiente empleando WITH:

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.

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#3Hellmuth Vargas
hivs77@gmail.com
In reply to: Hellmuth Vargas (#1)
Re: [GENERAL] No funciona WITH con mas de 2 sentencias DML

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&gt;=b.id <http://b.id&gt;*
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&gt;*
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@alvh.no-ip.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@2ndquadrant.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

#4Gustavo Borchez
listas@delplatasoluciones.com.ar
In reply to: Hellmuth Vargas (#3)
Auditoría y evaluación

Gente de los que saben:

Necesito saber cuales fueron los últimos movimientos en una base de
datos (en qué tablas ocurrieron).

¿Es esto posible?

Attachments:

Firma mail.jpgimage/jpeg; name="Firma mail.jpg"Download
#5Enrique Escobar
ekurth@live.com.mx
In reply to: Gustavo Borchez (#4)
Re: Auditoría y evaluación

Hola Gustavo.
Esto depende de como tiene activado o no activado la seccion de
configuracion del .conf ya que alli esta las opciones para poner a
postgres a guardar en sus log las bitacoras de eventos.
Checa primero como esta configurado.
Saludos

Show quoted text

On 06/10/2015 12:41, Gustavo Borchez wrote:

Gente de los que saben:

Necesito saber cuales fueron los últimos movimientos en una base de
datos (en qué tablas ocurrieron).

¿Es esto posible?

--
Saludos Enrique

#6Anthony Sotolongo
asotolongo@gmail.com
In reply to: Gustavo Borchez (#4)
Re: Auditoría y evaluación

Hola Gustavo
Tienes algún mecanismo de captura de cambios implementado?
o está el parametro log_statement=all?

saludos

El 06/10/15 a las 14:41, Gustavo Borchez escribió:

Show quoted text

Necesito saber cuales fueron los últimos movimientos en una base de
datos (en qué tablas ocurrieron).

#7Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Hellmuth Vargas (#3)
Re: [GENERAL] No funciona WITH con mas de 2 sentencias DML

Hellmuth Vargas escribi�:

Realice este peque�o laboratorio para presentar la inquietud:

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, telefono, 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, b.identificacion::int
FROM base b
GROUP BY b.telefono, b.identificacion::int;

???

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

#8Hellmuth Vargas
hivs77@gmail.com
In reply to: Alvaro Herrera (#7)
Re: [GENERAL] No funciona WITH con mas de 2 sentencias DML

Hola Alvaro...

mmm devolviendo ademas el teléfono desde base... mmm no lo había
considerado.. Mil Gracias

2015-10-06 14:01 GMT-05:00 Alvaro Herrera <alvherre@2ndquadrant.com>:

Hellmuth Vargas escribió:

Realice este pequeño laboratorio para presentar la inquietud:

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, telefono, 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, b.identificacion::int
FROM base b
GROUP BY b.telefono, b.identificacion::int;

???

--
Álvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
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

#9Hellmuth Vargas
hivs77@gmail.com
In reply to: Hellmuth Vargas (#1)
Re: ayuda con funcion List

Hola Igniris

Pruebalo con string_agg así:

SELECT
string_agg(distinct p.nombre,',') as prod,
string_agg(distinct fa.forma,',') as forma
FROM
public.producto p
INNER JOIN public.productoformaadquisclugar pfl ON (p.id = pfl.idproducto)
INNER JOIN public.formadeadquisicion fa ON (pfl.idforma = fa.id)

El 7 de octubre de 2015, 9:37 a. m., Igniris<ivaldivia@xetid.cu> escribió:

Buenos dias a todos
tengo un problema con la funcion LIST les pongo un ejemplo para ilustralo
mejor, tengo las siguientes tablas:
CREATE TABLE public.producto (
id NUMERIC NOT NULL,
nombre TEXT,
CONSTRAINT producto_pkey PRIMARY KEY(id)
) WITHOUT OIDS;
CREATE TABLE public.formadeadquisicion (
id NUMERIC NOT NULL,
forma TEXT,
CONSTRAINT formadeadquisicion_pkey PRIMARY KEY(id)
) WITHOUT OIDS;
CREATE TABLE public.productoformaadquisclugar (
idproducto NUMERIC NOT NULL,
idforma NUMERIC NOT NULL,
idlugar NUMERIC NOT NULL,
CONSTRAINT productoformaadquisc_pkey PRIMARY KEY(idproducto, idforma,
idlugar)
) WITHOUT OIDS;

Ahora tengo una consulta para obtener los producto por su forma de
adquisicion donde necesito los nombres de los productos y las formas
concatenados, la consulta seria esta:
SELECT
LIST(p.nombre) as prod,
LIST(fa.forma)as forma
FROM
public.producto p
INNER JOIN public.productoformaadquisclugar pfl ON (p.id =
pfl.idproducto)
INNER JOIN public.formadeadquisicion fa ON (pfl.idforma = fa.id)

el resultado de la consulta queda asi:

ahora el problema que estoy teniendo es que los usuarios necesitan que si
el producto se repite salga una sola vez, en este ejemplo el mango sale 2
veces y necesito que salga solo una, la funcion list que estoy usando es
esta:

CREATE FUNCTION comma_cat(text, text) RETURNS text
LANGUAGE sql
AS $_$select case
WHEN $2 is null or $2 = '' THEN $1
WHEN $1 is null or $1 = '' THEN $2
ELSE $1 || ', ' || $2
END$_$;
CREATE AGGREGATE list (
BASETYPE = text,
SFUNC = comma_cat,
STYPE = text,
INITCOND = ''
);

Muchas gracias por su ayuda, saludos

--
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

Attachments:

cggdiegj.pngimage/png; name=cggdiegj.pngDownload
#10Igniris
ivaldivia@xetid.cu
In reply to: Hellmuth Vargas (#3)
ayuda con funcion List

Buenos dias a todos
tengo un problema con la funcion LIST les pongo un ejemplo para
ilustralo mejor, tengo las siguientes tablas:
CREATE TABLE public.producto (
id NUMERIC NOT NULL,
nombre TEXT,
CONSTRAINT producto_pkey PRIMARY KEY(id)
) WITHOUT OIDS;
CREATE TABLE public.formadeadquisicion (
id NUMERIC NOT NULL,
forma TEXT,
CONSTRAINT formadeadquisicion_pkey PRIMARY KEY(id)
) WITHOUT OIDS;
CREATE TABLE public.productoformaadquisclugar (
idproducto NUMERIC NOT NULL,
idforma NUMERIC NOT NULL,
idlugar NUMERIC NOT NULL,
CONSTRAINT productoformaadquisc_pkey PRIMARY KEY(idproducto, idforma,
idlugar)
) WITHOUT OIDS;

Ahora tengo una consulta para obtener los producto por su forma de
adquisicion donde necesito los nombres de los productos y las formas
concatenados, la consulta seria esta:
SELECT
LIST(p.nombre) as prod,
LIST(fa.forma)as forma
FROM
public.producto p
INNER JOIN public.productoformaadquisclugar pfl ON (p.id =
pfl.idproducto)
INNER JOIN public.formadeadquisicion fa ON (pfl.idforma = fa.id)

el resultado de la consulta queda asi:

ahora el problema que estoy teniendo es que los usuarios necesitan que
si el producto se repite salga una sola vez, en este ejemplo el mango
sale 2 veces y necesito que salga solo una, la funcion list que estoy
usando es esta:

CREATE FUNCTION comma_cat(text, text) RETURNS text
LANGUAGE sql
AS $_$select case
WHEN $2 is null or $2 = '' THEN $1
WHEN $1 is null or $1 = '' THEN $2
ELSE $1 || ', ' || $2
END$_$;
CREATE AGGREGATE list (
BASETYPE = text,
SFUNC = comma_cat,
STYPE = text,
INITCOND = ''
);

Muchas gracias por su ayuda, saludos

Attachments:

cggdiegj.pngimage/png; name=cggdiegj.pngDownload
#11Gilberto Castillo
gilberto.castillo@etecsa.cu
In reply to: Igniris (#10)
Re: [MASSMAIL]ayuda con funcion List

Buenos dias a todos
tengo un problema con la funcion LIST les pongo un ejemplo para
ilustralo mejor, tengo las siguientes tablas:
CREATE TABLE public.producto (
id NUMERIC NOT NULL,
nombre TEXT,
CONSTRAINT producto_pkey PRIMARY KEY(id)
) WITHOUT OIDS;
CREATE TABLE public.formadeadquisicion (
id NUMERIC NOT NULL,
forma TEXT,
CONSTRAINT formadeadquisicion_pkey PRIMARY KEY(id)
) WITHOUT OIDS;
CREATE TABLE public.productoformaadquisclugar (
idproducto NUMERIC NOT NULL,
idforma NUMERIC NOT NULL,
idlugar NUMERIC NOT NULL,
CONSTRAINT productoformaadquisc_pkey PRIMARY KEY(idproducto, idforma,
idlugar)
) WITHOUT OIDS;

Ahora tengo una consulta para obtener los producto por su forma de
adquisicion donde necesito los nombres de los productos y las formas
concatenados, la consulta seria esta:
SELECT
LIST(p.nombre) as prod,
LIST(fa.forma)as forma
FROM
public.producto p
INNER JOIN public.productoformaadquisclugar pfl ON (p.id =
pfl.idproducto)
INNER JOIN public.formadeadquisicion fa ON (pfl.idforma = fa.id)

el resultado de la consulta queda asi:

ahora el problema que estoy teniendo es que los usuarios necesitan que
si el producto se repite salga una sola vez, en este ejemplo el mango
sale 2 veces y necesito que salga solo una, la funcion list que estoy

Que tal si le pones al select la clausula DISTINC

usando es esta:

CREATE FUNCTION comma_cat(text, text) RETURNS text
LANGUAGE sql
AS $_$select case
WHEN $2 is null or $2 = '' THEN $1
WHEN $1 is null or $1 = '' THEN $2
ELSE $1 || ', ' || $2
END$_$;
CREATE AGGREGATE list (
BASETYPE = text,
SFUNC = comma_cat,
STYPE = text,
INITCOND = ''
);

Muchas gracias por su ayuda, saludos

Saludos,
Gilberto Castillo
ETECSA, La Habana, Cuba

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

#12Anthony Sotolongo
asotolongo@gmail.com
In reply to: Hellmuth Vargas (#1)
Re: ayuda con funcion List

Hola Igniris fijate en la version que tienes de postgresql cuando lo llevas
a la app real pues esa funcion esta disponible desde postgresql 9.0 si mas
no recuerdo. Y el error que tw da es de sintaxis
Saludos
El oct 9, 2015 9:28 AM, "Igniris" <ivaldivia@xetid.cu> escribió:

Show quoted text

Muchas gracias Hellmuth probe con tu solucion y en la consulta funciono,
pero cuando lo pongo en la funcion de la app reaal me da error de sintaxis
como este:

'Doctrine_Connection_Pgsql_Exception' with message 'SQLSTATE[42601]: Syntax error: 7

si lo quito y lo pongo como estaba funciona pero con la deficiencia que les comentaba inicialmente, saludos y gracias

El 07/10/2015 a las 08:46 a. m., Hellmuth Vargas escribió:

Hola Igniris

Pruebalo con string_agg así:

SELECT
string_agg(distinct p.nombre,',') as prod,
string_agg(distinct fa.forma,',') as forma
FROM
public.producto p
INNER JOIN public.productoformaadquisclugar pfl ON (p.id =
pfl.idproducto)
INNER JOIN public.formadeadquisicion fa ON (pfl.idforma = fa.id)

El 7 de octubre de 2015, 9:37 a. m., Igniris<ivaldivia@xetid.cu> escribió:

Buenos dias a todos
tengo un problema con la funcion LIST les pongo un ejemplo para ilustralo
mejor, tengo las siguientes tablas:
CREATE TABLE public.producto (
id NUMERIC NOT NULL,
nombre TEXT,
CONSTRAINT producto_pkey PRIMARY KEY(id)
) WITHOUT OIDS;
CREATE TABLE public.formadeadquisicion (
id NUMERIC NOT NULL,
forma TEXT,
CONSTRAINT formadeadquisicion_pkey PRIMARY KEY(id)
) WITHOUT OIDS;
CREATE TABLE public.productoformaadquisclugar (
idproducto NUMERIC NOT NULL,
idforma NUMERIC NOT NULL,
idlugar NUMERIC NOT NULL,
CONSTRAINT productoformaadquisc_pkey PRIMARY KEY(idproducto, idforma,
idlugar)
) WITHOUT OIDS;

Ahora tengo una consulta para obtener los producto por su forma de
adquisicion donde necesito los nombres de los productos y las formas
concatenados, la consulta seria esta:
SELECT
LIST(p.nombre) as prod,
LIST(fa.forma)as forma
FROM
public.producto p
INNER JOIN public.productoformaadquisclugar pfl ON (p.id =
pfl.idproducto)
INNER JOIN public.formadeadquisicion fa ON (pfl.idforma = fa.id)

el resultado de la consulta queda asi:

ahora el problema que estoy teniendo es que los usuarios necesitan que si
el producto se repite salga una sola vez, en este ejemplo el mango sale 2
veces y necesito que salga solo una, la funcion list que estoy usando es
esta:

CREATE FUNCTION comma_cat(text, text) RETURNS text
LANGUAGE sql
AS $_$select case
WHEN $2 is null or $2 = '' THEN $1
WHEN $1 is null or $1 = '' THEN $2
ELSE $1 || ', ' || $2
END$_$;
CREATE AGGREGATE list (
BASETYPE = text,
SFUNC = comma_cat,
STYPE = text,
INITCOND = ''
);

Muchas gracias por su ayuda, saludos

--
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

#13Igniris
ivaldivia@xetid.cu
In reply to: Hellmuth Vargas (#9)
Re: ayuda con funcion List

Muchas gracias Hellmuth probe con tu solucion y en la consulta funciono,
pero cuando lo pongo en la funcion de la app reaal me da error de
sintaxis como este:

|'Doctrine_Connection_Pgsql_Exception' with message 'SQLSTATE[42601]: Syntax||error: 7 si lo quito y lo pongo como estaba funciona pero con la
deficiencia que les comentaba inicialmente, saludos y gracias |

El 07/10/2015 a las 08:46 a. m., Hellmuth Vargas escribió:

Show quoted text

Hola Igniris

Pruebalo con string_agg así:

SELECT
string_agg(distinct p.nombre,',') as prod,
string_agg(distinct fa.forma,',') as forma
FROM
public.producto p
INNER JOIN public.productoformaadquisclugar pfl ON (p.id
<http://p.id/&gt; = pfl.idproducto)
INNER JOIN public.formadeadquisicion fa ON (pfl.idforma = fa.id
<http://fa.id/&gt;)

El 7 de octubre de 2015, 9:37 a. m., Igniris<ivaldivia@xetid.cu
<mailto:ivaldivia@xetid.cu>> escribió:

Buenos dias a todos
tengo un problema con la funcion LIST les pongo un ejemplo para
ilustralo mejor, tengo las siguientes tablas:
CREATE TABLE public.producto (
id NUMERIC NOT NULL,
nombre TEXT,
CONSTRAINT producto_pkey PRIMARY KEY(id)
) WITHOUT OIDS;
CREATE TABLE public.formadeadquisicion (
id NUMERIC NOT NULL,
forma TEXT,
CONSTRAINT formadeadquisicion_pkey PRIMARY KEY(id)
) WITHOUT OIDS;
CREATE TABLE public.productoformaadquisclugar (
idproducto NUMERIC NOT NULL,
idforma NUMERIC NOT NULL,
idlugar NUMERIC NOT NULL,
CONSTRAINT productoformaadquisc_pkey PRIMARY KEY(idproducto,
idforma, idlugar)
) WITHOUT OIDS;

Ahora tengo una consulta para obtener los producto por su forma de
adquisicion donde necesito los nombres de los productos y las
formas concatenados, la consulta seria esta:
SELECT
LIST(p.nombre) as prod,
LIST(fa.forma)as forma
FROM
public.producto p
INNER JOIN public.productoformaadquisclugar pfl ON (p.id
<http://p.id&gt; = pfl.idproducto)
INNER JOIN public.formadeadquisicion fa ON (pfl.idforma = fa.id
<http://fa.id&gt;)

el resultado de la consulta queda asi:

ahora el problema que estoy teniendo es que los usuarios necesitan
que si el producto se repite salga una sola vez, en este ejemplo
el mango sale 2 veces y necesito que salga solo una, la funcion
list que estoy usando es esta:

CREATE FUNCTION comma_cat(text, text) RETURNS text
LANGUAGE sql
AS $_$select case
WHEN $2 is null or $2 = '' THEN $1
WHEN $1 is null or $1 = '' THEN $2
ELSE $1 || ', ' || $2
END$_$;
CREATE AGGREGATE list (
BASETYPE = text,
SFUNC = comma_cat,
STYPE = text,
INITCOND = ''
);

Muchas gracias por su ayuda, saludos

--
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

#14Hellmuth Vargas
hivs77@gmail.com
In reply to: Igniris (#13)
Re: ayuda con funcion List

Hola Igniris

Según indica, debe tener una versión que soporta string_agg pues lo
verificó directamente en consola y funcionó, es posible que lo este
molestando es la comillas sencilla (') si esta embebiendo la sentencia en
una cadena. Si puede copiar el pedazo de código donde emplea la sentencia
para poder analizar mejor el problema

SELECT
string_agg(distinct p.nombre,',') as prod,
string_agg(distinct fa.forma,',') as forma
FROM
public.producto p
INNER JOIN public.productoformaadquisclugar pfl ON (p.id =

pfl.idproducto)

INNER JOIN public.formadeadquisicion fa ON (pfl.idforma = fa.id)

El oct. 9, 2015 7:27 AM, "Igniris" <ivaldivia@xetid.cu> escribió:

Show quoted text

Muchas gracias Hellmuth probe con tu solucion y en la consulta funciono,
pero cuando lo pongo en la funcion de la app reaal me da error de sintaxis
como este:

'Doctrine_Connection_Pgsql_Exception' with message 'SQLSTATE[42601]: Syntax error: 7

si lo quito y lo pongo como estaba funciona pero con la deficiencia que les comentaba inicialmente, saludos y gracias

El 07/10/2015 a las 08:46 a. m., Hellmuth Vargas escribió:

Hola Igniris

Pruebalo con string_agg así:

SELECT
string_agg(distinct p.nombre,',') as prod,
string_agg(distinct fa.forma,',') as forma
FROM
public.producto p
INNER JOIN public.productoformaadquisclugar pfl ON (p.id =
pfl.idproducto)
INNER JOIN public.formadeadquisicion fa ON (pfl.idforma = fa.id)

El 7 de octubre de 2015, 9:37 a. m., Igniris<ivaldivia@xetid.cu> escribió:

Buenos dias a todos
tengo un problema con la funcion LIST les pongo un ejemplo para ilustralo
mejor, tengo las siguientes tablas:
CREATE TABLE public.producto (
id NUMERIC NOT NULL,
nombre TEXT,
CONSTRAINT producto_pkey PRIMARY KEY(id)
) WITHOUT OIDS;
CREATE TABLE public.formadeadquisicion (
id NUMERIC NOT NULL,
forma TEXT,
CONSTRAINT formadeadquisicion_pkey PRIMARY KEY(id)
) WITHOUT OIDS;
CREATE TABLE public.productoformaadquisclugar (
idproducto NUMERIC NOT NULL,
idforma NUMERIC NOT NULL,
idlugar NUMERIC NOT NULL,
CONSTRAINT productoformaadquisc_pkey PRIMARY KEY(idproducto, idforma,
idlugar)
) WITHOUT OIDS;

Ahora tengo una consulta para obtener los producto por su forma de
adquisicion donde necesito los nombres de los productos y las formas
concatenados, la consulta seria esta:
SELECT
LIST(p.nombre) as prod,
LIST(fa.forma)as forma
FROM
public.producto p
INNER JOIN public.productoformaadquisclugar pfl ON (p.id =
pfl.idproducto)
INNER JOIN public.formadeadquisicion fa ON (pfl.idforma = fa.id)

el resultado de la consulta queda asi:

ahora el problema que estoy teniendo es que los usuarios necesitan que si
el producto se repite salga una sola vez, en este ejemplo el mango sale 2
veces y necesito que salga solo una, la funcion list que estoy usando es
esta:

CREATE FUNCTION comma_cat(text, text) RETURNS text
LANGUAGE sql
AS $_$select case
WHEN $2 is null or $2 = '' THEN $1
WHEN $1 is null or $1 = '' THEN $2
ELSE $1 || ', ' || $2
END$_$;
CREATE AGGREGATE list (
BASETYPE = text,
SFUNC = comma_cat,
STYPE = text,
INITCOND = ''
);

Muchas gracias por su ayuda, saludos

--
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

#15Gustavo Borchez
gborchez@delplatasoluciones.com.ar
In reply to: Enrique Escobar (#5)
Re: Auditoría y evaluación

Gracias gente. Voy a investigarlo.

El 06/10/2015 a las 14:58, Enrique Escobar escribió:

Show quoted text

Hola Gustavo.
Esto depende de como tiene activado o no activado la seccion de
configuracion del .conf ya que alli esta las opciones para poner a
postgres a guardar en sus log las bitacoras de eventos.
Checa primero como esta configurado.
Saludos

On 06/10/2015 12:41, Gustavo Borchez wrote:

Gente de los que saben:

Necesito saber cuales fueron los últimos movimientos en una base de
datos (en qué tablas ocurrieron).

¿Es esto posible?

--
Saludos Enrique

Attachments:

Firma mail.jpgimage/jpeg; name="Firma mail.jpg"Download