Skip site navigation (1) Skip section navigation (2)

Identificador único en Jerarquía

From: will <wrbutros(at)rizoma(dot)cl>
To: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Identificador único en Jerarquía
Date: 2012-03-21 19:34:02
Message-ID: 4F6A2D2A.3060106@rizoma.cl (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Hola a todos!...
Hace poco envié un correo a la lista consultando por una query recursiva 
que me permitiera
conocer todos los componentes de una mercadería (componentes que a su 
vez podían tener otros componentes), la cual resultó exitosa.
(http://grokbase.com/t/postgresql/pgsql-es-ayuda/123588qv4j/funci%C3%B3n-recursiva)

Mi situación actual:
-------------------------------
A modo de recuento:
Estoy creando un POS bajo la GPL , que me permita controlar mercaderías 
compuestas
(una mercadería virtual que contiene dentro de sí otras mercaderías), 
algo así como son las
ofertas (1 pan + 2 galletas por X $$), pero también hay otros casos más 
complejos como
un plato de comida, un pastel, etc...

Ahora sucede que necesito registrar en una tabla (al momento de vender 
un compuesto)
todos los componentes (y sub componentes) de la mercadería en cuestión, 
detallando la cantidad
requerida de cada componente, entre otras cosas.
De manera que a futuro pueda saber que componentes (con sus detalles) 
participaron de ésta mercadería
en el momento mismo de la venta. Esto último es necesario porque también 
se podría dar el caso
que se desee cambiar algunos componentes o sus detalles a futuro.
(Algo muy común si se desean reemplazar solo algunos componentes de un 
plato, o mercadería preparada:
  algo así como cambiar mantequilla por manteca en un pan)

El problema:
---------------------
Hasta el momento todo iba bien, pero sucede que para efectos de informe 
a futuro
necesito saber con exactitud que componente era de qué compuesto, y esto 
se complica
cuando el nivel de jerarquía se extiende demasiado, y los componentes se 
repiten en distintos compuestos
o el mismo compuesto se repite en diferentes niveles:


Para ser más concreto, les doy un Ejemplo:

Ejemplo 1:
------------------
http://pastebin.com/K5cwgT6C

Aquí se puede ver que:
* I es hijo de E e hijo de J
* I a su vez tiene hijos M y N

Hasta este momento no tengo como identificar a qué I pertenece cada M y N

Traté de solucionar el problema creando un ID vector que contuviese 
ciertos datos,
como el nivel de gerarquía, un id de hijo propio, y un id de padre...

Quedando:
------------------
http://pastebin.com/SzNtfY1Y

Esto soluciona el caso de M y N que pertenecen a I, pero de distintos 
niveles de jerarquía

El problema de esto es que pueden haber mercaderías "repetidas" dentro del
mismo nivel de jerarquía, y no tengo forma de identificar a su padre 
verdadero, como es el caso de
como es el caso de U y V.

Además en la consulta recursiva agregué la clausula row_number() over 
(), esto le da un id al hijo
pero ese id es único solo dentro de su padre.


Pregunta:
---------------------------------

Cómo puedo hacer que esta consulta

WITH RECURSIVE compuesta (Madre, Hijo, id) AS
             (
              SELECT madre, hijo,
                             ARRAY[0, --id_único] AS id_madre
              FROM componente_mc WHERE madre = A
               UNION ALL
               SELECT componente_mc.madre, componente_mc.hijo,
                             ARRAY[id_madre[2], --id_único],
                  FROM componente_mc, compuesta
              WHERE componente_mc.madre = compuesta.hijo
             )
             SELECT Hijo, Madre
             FROM compuesta

pueda generar un id único como identificador (donde dice --id_único), y 
que no se repita en ningún padre?,
de forma que quede como el siguiente ejemplo :

http://pastebin.com/nc1YNUkQ


De antemano,
Muchísimas gracias! =)






Responses

pgsql-es-ayuda by date

Next:From: Jaime CasanovaDate: 2012-03-21 21:58:24
Subject: Re: [pgsql-es-ayuda] Identificador único en Jerarqu?==?ISO-8859-1?Q?ía
Previous:From: Marcos Michel Martinez PerezDate: 2012-03-21 19:20:08
Subject: Re: errorSaludos

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group