SoloCodigo
Bases de Datos => Otras Bases de Datos => PostgreSQL => Mensaje iniciado 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?
-
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
-
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
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
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
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
-
Ya probaste consulta1{A,B} LEFT JOIN consulta2{A,C}??
-
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
-
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.
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 :)
-
Hola,
Funciona, f u n c i o n a :bravo: :jumpie: