Consulta Complicada

18/05/2004 - 22:10 por Gustavo Monasterios | Informe spam
A ver si me explico: Tengo una tabla Entidades que
contiene una clave principal EntidadID y otro campo
AsignadoA que representa de que otra Entidad depende
esta. Esto es para crear una grado de jerarquias entre
Entidades. Tengo otra tabla Transacciones donde se
almacenan los movimientos de dinero entre dos entidades,
mediante los campos Origen y Destino. Mi duda estriba en
como puedo hacer una consulta que me muestre las
transacciones que tengan como origen a una determinada
entidad y a las entidades que esten por debajo de ella en
el arbol de asignacion de entidades solamente.

Preguntas similare

Leer las respuestas

#6 Javier Loria
19/05/2004 - 17:36 | Informe spam
Hola:
En la tabla que nos enviaste AsignadoAEntidadID no permite nulos, y me
queda la duda de como representas a las entidades que son "raiz" o sea que
no tienen padres. Es posible representarlo con el mismo numero de entidad,
pero entonces el Identiy de EntidadID no tiene sentido. Por el momento asumo
que esta columna permite nulos y las que tienen en nulo esta columna son las
raices.
Con la siguiente consulta te debe dar cada entidad y sus Hijos, Nietos y
Bisnietos.
==-- Hijos
SELECT H.EntidadID, E.EntidadID AS EntidadSuperior
FROM Entidades AS E
JOIN Entidades AS H
ON E.EntidadId=H.AsignadoAEntidadID
UNION ALL
SELECT N.EntidadID, E.EntidadID
FROM Entidades AS E
JOIN Entidades AS H
ON E.EntidadId=H.AsignadoAEntidadID
JOIN Entidades AS N
ON H.EntidadId=N.AsignadoAEntidadID
UNION ALL
SELECT B.EntidadID, E.EntidadID
FROM Entidades AS E
JOIN Entidades AS H
ON E.EntidadId=H.AsignadoAEntidadID
JOIN Entidades AS N
ON H.EntidadId=N.AsignadoAEntidadID
JOIN Entidades AS B
ON N.EntidadId=B.AsignadoAEntidadID
== Entonces esto la puedes usar como base para las consultas, ya sea por
medio de una vista o directamente. Si quieres todas las transacciones entre
entidades del mismo arbol seria algo como:
=SELECT TransaccionID
FROM Transacciones
JOIN (<<Select de Arriba o Vista >>) AS AncestrosEntidades
ON (OrigenEntidadID=AncestrosEntidades.EntidadID
AND DestinoEntidadID=AncestrosEntidades.EntidadSuperior) OR
(OrigenEntidadID=AncestrosEntidades.EntidadSuperior
AND DestinoEntidadID=AncestrosEntidades.EntidadID)
= En este caso asumi que no habia transacciones donde OrigenEntidadID y
DestinoEntidadID fueran iguales.
Espero te sirva,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

escribio:
Los niveles máximos son cuatro

CREATE TABLE [dbo].[ENTIDADES] (
[EntidadID] [int] IDENTITY (1, 1) NOT NULL ,
[Entidad] [varchar] (30) COLLATE
Modern_Spanish_CI_AS NOT NULL ,
[DireccionEntidad] [varchar] (80) COLLATE
Modern_Spanish_CI_AS NOT NULL ,
[TelefonoEntidad] [varchar] (50) COLLATE
Modern_Spanish_CI_AS NOT NULL ,
[FechaCreacion] [datetime] NOT NULL ,
[Vende] [bit] NOT NULL ,
[ParticipacionEntidad] [smallmoney] NOT NULL ,
[CuotaEntidad] [money] NOT NULL ,
[DeudaEntidad] [money] NOT NULL ,
[TipoEntidad] [smallint] NOT NULL ,
[Impuesto] [smallmoney] NOT NULL ,
[TipoCuotaEntidad] [smallint] NOT NULL ,
[Ciudad] [varchar] (30) COLLATE
Modern_Spanish_CI_AS NOT NULL ,
[Estado] [smallint] NOT NULL ,
[Propia] [bit] NOT NULL ,
[AsignadoAEntidadID] [int] NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[TRANSACCIONES] (
[TransaccionID] [int] IDENTITY (1, 1) NOT NULL ,
[FechaTransaccion] [datetime] NOT NULL ,
[MontoTransaccion] [money] NOT NULL ,
[OrigenEntidadID] [int] NOT NULL ,
[DestinoEntidadID] [int] NOT NULL ,
[CuentaDestinoCuentaID] [int] NOT NULL ,
[CuentaOrigenCuentaID] [int] NOT NULL ,
[ConceptoID] [int] NOT NULL
) ON [PRIMARY]
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida