Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Query un poco complicado (https://www.clubdelphi.com/foros/showthread.php?t=28265)

erasmorc 14-12-2005 18:57:54

Query un poco complicado
 
Buenas tardes,

La pregunta resumida es como relacionar un campo que esta contenido en el resultado de un select con otra tabla.

Tengo el siguiente problema tengo un select que me arroja unos resultado los cuales quiero utilizar para relacionar uno de los campos de ese resultado con otra tabla a travez de un join. como hacer el Join eso lo tengo bastante claro la pregunta es como utilizar el resultado del select que esta en esa misma sentencia. Las tablas y la base de datos son de SQL server 2000 y estoy usando el query analizer del mismo SQL.

Pienso que quizas con Queries anidados podria hacerlo pero no se como utilizarlos. Recuerden que el resultado del select no es una tabla fisica entonces eso es lo que no se como hacer tomar ese resultado del select o mejor dicho uno de sus campos para relacionarlo con otra tabla.

Si tienen algun link donde haya informacion, o algun ejemplo se los agradeceria, actualmente lo resolvi insertando ese resultado en otra tabla y haciendo la relacion a partir de ella, pero no es un metodo elegante ni profesional.


El problema que tengo no es con los join en realidad, ese tema lo manejo mas o menos bien, mi problema es como puedo usar el resultado que me da un query para relacionarlo con otra tabla.

por ejemplo :

Tabla1
codigo Char
nombre Char
sueldo Float
codigocomentario Char

Tabla2
codigo Char (relacion con tabla1.codigo)
descuento

Tabla3 (contiene comenatarios)
codigo Char (relacion con tabla1.codigocomentario)
descripcion Text



Select T1.codigo,T1.nombre,T1.sueldo,T1.codigocomentario, SUM(T2.descuento) As descuento
From Tabla1 as T1

LEFT JOIN Tabla2 As T2 ON T1.codigo = T2.codigo
WHERE T1.codigo= :pnum
Group by T1.codigo,T1.nombre,T1.sueldo,T1.codigocomentario

Order By T1.codigo

Hasta ahi todo va bien, pero yo necesitaba en ese select la descripcion que contiene la tabla Tabla3 pero no puedo agregarla ya que tiene el campo descripcion tipo Text por lo cual no puedo tenerla en el Group by, que pasa lo que he pensado es el resultado de ese query que esta arriba utilizarlo para hacer en otro select un join con la tabla a traves de los campos T1.codigocomentario ( que estaria incluido en el resultado del primer select) y el campo T3.codigo.

Actualmente lo que hago es que el resultdo del primer select lo inserto en una tabla y entonces hago el join con la tabla Tabla3, pero este metodo no es el mas recomendado.

Estas tablas que estoy presentando no son las reales de la problematica pero reflejan lo que quiero hacer.

Si tienes un manual que contenga de forma detallada como trabajar con select anidados y me lo puedes facilitar te lo voy a agradecer mucho, o algun ejemplo que me ayude en el tema.

Slds,
Neo

jwmoreira 14-12-2005 19:33:03

A ver si te sirve ésto:
Código:

 
select tabla1.campo, tabla2.campo, tabla3.campo
from tabla1 left outer join tabla2 on tabla1.campo1 = tabla2.campo
          left outer join tabla3 on tabla1.campo2 = tabla3.campo

ó también: (Versión 2.0)
Código:


select alias.campo, alias.campo, tabla3.campo
from (
select tabla1.campo, tabla2.campo
from tabla1 left outer join tabla2 on tabla1.campo1 = tabla2.campo
) alias left outer join tabla3 on alias.campo = tabla3.campo

Saludos,
Jorge.

jwmoreira 14-12-2005 19:35:27

Perdon, a lo que me refiero con lo de la versión 2.0 eso es para Firebird, si es sql server, oracle, Informix no he tenido problema.

Saludos,
Jorge.

FOURIER 14-12-2005 21:30:17

Espero Que Te Sirva Esto
 
Buenas tardes,

primero que nada lo que entiendo es que quieres desplegar los sigguiente:

T1.CODIGO T1.NOMBRE T1.SUELDO T1.CODIGOCOMENTARIO T3.DESCRIPION SUM(T2.Descuento)

esas son tus tablas;

Tabla1
codigo Char
nombre Char
sueldo Float
codigocomentario Char

Tabla2
codigo Char (relacion con tabla1.codigo)
descuento

Tabla3 (contiene comenatarios)
codigo Char (relacion con tabla1.codigocomentario)
descripcion Text

a lo que entiendo con tu esquema es que un comentario en tabla3 lo puedes asignar a varias tablas1... finalmente entiendo también que la tabla2 contiene varios descuentos para la tabla2 y que además de eso la tabla 2 no tiene campo llave.. en fin

y finalmente segun la consulta que me pones que haces

Select T1.codigo,T1.nombre,T1.sueldo,T1.codigocomentario, SUM(T2.descuento) As descuento
From Tabla1 as T1
LEFT JOIN Tabla2 As T2 ON T1.codigo = T2.codigo
WHERE T1.codigo= :pnum
Group by T1.codigo,T1.nombre,T1.sueldo,T1.codigocomentario
Order By T1.codigo

entiendo que pasas como parámeto el código a T1.codigo por medio de la variable :pnum.

si todo esto es cierto entonces podríamos resolver tu problema de la siguiente forma

select T1.Codigo,T1.nombre,T1.sueldo,T1.codigocomentario,T3.descripcion,(select sum(T2.descuento) from Tabla2 as T2 where T2.codigo=T1.codigo) as Descuentos from Tabla1 as T1,Tabla3 as T3 where T1.codigocomentario=T3.codigo and T1.codigo= :pnum;

jwmoreira 15-12-2005 00:47:38

Aplicado a tu select:

Código:

Select T1.codigo,T1.nombre,T1.sueldo,T1.codigocomentario, (Select SUM(T2.descuento) From Tabla2 As T2 Where T2.codigo = T1.codigo ) As descuento, T3.descripcion
From Tabla1 as T1
LEFT OUTER JOIN Tabla3 As T3 ON T1.codigocomentario = T3.codigo
WHERE T1.codigo= :pnum
Order By T1.codigo

ó
Código:

Select T.*,T3.descripcion FROM (
  Select T1.codigo,T1.nombre,T1.sueldo,T1.codigocomentario, SUM(T2.descuento) As descuento
  From Tabla1 as T1
LEFT OUTER JOIN Tabla2 As T2 ON T1.codigo = T2.codigo
  WHERE T1.codigo= :pnum
  Group by T1.codigo,T1.nombre,T1.sueldo,T1.codigocomentario

) As T LEFT OUTER JOIN Tabla3 As T3 ON T.codigocomentario = T3.codigo
Order By T.codigo

Saludos,
Jorge.


La franja horaria es GMT +2. Ahora son las 20:05:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi