SoloCodigo

Bases de Datos => Otras Bases de Datos => PostgreSQL => Mensaje iniciado por: codeforall en Sábado 24 de Noviembre de 2012, 11:22

Título: Como combinar dos consultas sin perder filas
Publicado por: codeforall en Sábado 24 de Noviembre de 2012, 11:22
Hola,

 He hecho dos consultas que funcionan. Una da como resultado 10 filas y la otra 8 filas. Las dos consultas las hago sobre tres tablas, como ejemplo sera asi:

consulta 1: tabla A y B : resultado 10 filas
consulta 2: tabla A y C : resultado 8 filas

Se que existe lo de INNER JOIN Y OUTER JOIN pero he probado y el resultado solo me salen 3 filas cuando yo quiero que esten las 10 filas.

¿Cómo puedo hacerlo?
Título: Re:Como combinar dos consultas sin perder filas
Publicado por: ProfesorX en Domingo 25 de Noviembre de 2012, 07:07
Me temo que con la informacion que pones no es posible ayudarte ya que no pones ni la consulta, ni la estructura de tu base de datos, ni que resultado esperas obtener, solo dices que obtienes 3 filas de 10, pero sin mas informacion no se puede saber que necesitas, debes ser mas explicito
Título: Re:Como combinar dos consultas sin perder filas
Publicado por: codeforall en Jueves 29 de Noviembre de 2012, 07:43
Hola,

He estado buscando más información y creo que se trata de una anidación de consultas, aunque no estoy seguro por que creo que anidar consultas es que el resultado de una sirva para la otra.

La consulta que tengo que conseguir es la relacion de todos los palacios(son de exposiciones) indicando el numero de stands que tiene i el numero de personas que se le han asignado i incorporado en algun momento. tiene que estar ordenado por el codigo del palacio y la ciudad

Te muestro la estructura:
ENTIDADES
Palacios(Codigo, Ubicacion, Importancia) "La ubicacion =la ciudad"
Estands(Palacio, Num_estand, tamaño)
{Palacio} clave foranea de Palacios

INTERERELACIONES
Asignan (Palacio, DNI, faena)
{Palacio} clave foranea de Palacios
Incorporan(Feria, convocatoria, DNI, Palacio, Estand, Turno)
{Palau, Estand} clave foranea de Estands

Consulta que muestra codigo, ciudad y nº de estands
Código: [Seleccionar]
SELECT codo,  ubicacion,  COUNT (palacio) AS num_estands
FROM palacios, estands
WHERE palacios.codigo = estands.palacio
GROUP BY codigo, ubicacio
ORDER BY num_estands
Consulta que muestra las personas asignadas
Código: [Seleccionar]
SELECT codigo, 
COUNT (asignan.palacio) AS personas_asignadas
FROM palacios
LEFT OUTER JOIN asignan ON palacios.codigo = asignan.palacio
GROUP BY codigo
Consulta que muestra las personas incorporadas
Código: [Seleccionar]
SELECT codigo, 
COUNT (incorporan.palacio) AS personas_incorporadas
FROM palacios
LEFT OUTER JOIN incorporan ON palacios.codigo = incorporan.palacio
GROUP BY codigo

Como puedes ver por separado las tengo hechas pero aun no logro que el resultado este en una unica tabla. No manejo bien las consultas multiples.

Saludos y gracias
Título: Re:Como combinar dos consultas sin perder filas
Publicado por: DiabloRojo en Jueves 29 de Noviembre de 2012, 17:04
Ya probaste consulta1{A,B} LEFT JOIN consulta2{A,C}??
Título: Re:Como combinar dos consultas sin perder filas
Publicado por: codeforall en Jueves 29 de Noviembre de 2012, 18:41
Hola,

 Pues eso nunca lo habia hecho, lo he provado pero me parece que me falta mucha practica por que
me estoy viendo todos los errores; no lo consigo.

Saludos
Título: Re:Como combinar dos consultas sin perder filas
Publicado por: ProfesorX en Sábado 1 de Diciembre de 2012, 21:38
Hola de nuevo codeforall, disculpa por no poder contestar antes.

Bueno, he analizado tu problema, y creo que es posible de hacer mediante subquerys y utilizando alias

Desconozco si PostgreSQL soporta alias, pero suponiendo que si, le asignaremos un alias "a" a la consulta 1, un alias "b" a la consulta 2, y un alias "c" a la consulta 3.

Te dejo el sguiente codigo, que probe en SQL Server y funciona adecuadamente, si PostgreSQL no soporta el uso de alias y subquerys, te recomendaria que crearas tablas temporales para guardar las subquerys y luego hagas un query normal con las tablas temporales, no se si me entiendas a que me refiero.

Código: [Seleccionar]
select a.codigo, a.ubicacion, a.num_estands, b.personas_asignadas, c.personas_incorporadas
from
(SELECT codigo,  ubicacion,  COUNT (palacio) AS num_estands
FROM palacios, estands
WHERE palacios.codigo = estands.palacio
GROUP BY codigo, ubicacion
) a
inner join
(SELECT codigo, 
COUNT (asignan.palacio) AS personas_asignadas
FROM palacios
LEFT OUTER JOIN asignan ON palacios.codigo = asignan.palacio
GROUP BY codigo) b
on a.codigo = b.codigo
inner join
(SELECT codigo, 
COUNT (incorporan.palacio) AS personas_incorporadas
FROM palacios
LEFT OUTER JOIN incorporan ON palacios.codigo = incorporan.palacio
GROUP BY codigo) c
on a.codigo = c.codigo
order by a.codigo, a.ubicacion;

Saludos :)
Título: Re:Como combinar dos consultas sin perder filas
Publicado por: codeforall en Domingo 2 de Diciembre de 2012, 09:17
Hola,

 Funciona, f u n c i o n a   :bravo: :jumpie: