Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Doble left outer join SQL Server

Estas en el tema de Doble left outer join SQL Server en el foro de SQL Server en Foros del Web. Buenas tardes, Podría alguien ayudarme? Mi problema es el siguiente, tengo tres tablas: Tabla 1 CONTINENTE CONTINENTE_ID CONTINENTE 1 AMERICA 2 AFRICA 3 ASIA TABLA ...
  #1 (permalink)  
Antiguo 21/06/2012, 08:10
 
Fecha de Ingreso: junio-2012
Mensajes: 2
Antigüedad: 11 años, 10 meses
Puntos: 0
Doble left outer join SQL Server

Buenas tardes,

Podría alguien ayudarme? Mi problema es el siguiente, tengo tres tablas:

Tabla 1 CONTINENTE
CONTINENTE_ID CONTINENTE
1 AMERICA
2 AFRICA
3 ASIA



TABLA 2 PAIS
PAIS_ID CONTINENTE PAIS
1 AMERICA COLOMBIA
2 AMERICA CUBA
3 AFRICA KENYA

Como veis no tengo pais para ASIA

TABLA 3 CIUDAD

CIUDAD_ID CONTINENTE PAIS CIUDAD
1 AMERICA COLOMBIA BOGOTA
2 AMERICA COLOMBIA CARTAGENA
3 AMERICA CUBA LA HABANA
4 ASIA NULL PEKIN

La idea de la query es la siguiente, necesito para cada pais el número de ciudades que tiene, si no tiene ciudades me devuelve cero.

El resultado sería:

AMERICA COLOMBIA 2
AMERICA CUBA 1
ASIA NULL 1
AFRICA KENYA 0

Lo he intentado de la siguiente manera pero no me sale bien:

SELECT B.CONTINENTE, B.PAIS, COUNT(A.PAIS)
FROM CONTINENTE B LEFT OUTER JOIN PAIS C
ON B.CONTINENTE=C.CONTINENTE
LEFT OUTER JOIN CIUTDAD A ON B.CONTINENTE=A.CONTINENTE AND C.PAIS=A.PAIS
GROUP BY B.CONTINENTE, B.PAIS


Muchas gracias
  #2 (permalink)  
Antiguo 21/06/2012, 09:20
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Doble left outer join SQL Server

Aqui hay varias cosas, primero tus tablas no estan normalizadas, repites los nombres de los continentes y paises en las tablas de paises y ciudades, mejor usa id's para que quede normalizada, segundo pides el total de ciudades por pais, si asia tiene una ciudad que es pekin pero no tiene un pais como quieres que salga 1, a tu logica seria el numero de ciudades por continente no por pais, ya que si es por pais no tiene porque salir pekin, si es por continente si.

Código SQL:
Ver original
  1. CREATE TABLE #continente(
  2. id INT,
  3. continente VARCHAR(20)
  4. )
  5.  
  6. INSERT INTO #continente VALUES (1,'America')
  7. INSERT INTO #continente VALUES (2,'Africa')
  8. INSERT INTO #continente VALUES (3,'Asia')
  9. CREATE TABLE #pais(
  10. id INT,
  11. id_continente INT,
  12. pais VARCHAR(20)
  13. )
  14. INSERT INTO #pais VALUES (1,1,'colombia')
  15. INSERT INTO #pais VALUES (2,1,'cuba')
  16. INSERT INTO #pais VALUES (3,2,'kenia')
  17.  
  18.  
  19. CREATE TABLE #ciudad(
  20. id INT,
  21. id_continente INT,
  22. id_pais INT,
  23. nombre VARCHAR(20)
  24. )
  25.  
  26. INSERT INTO #ciudad VALUES (1,1,1,'bogota')
  27. INSERT INTO #ciudad VALUES (2,1,1,'cartagena')
  28. INSERT INTO #ciudad VALUES (3,1,2,'la habana')
  29. INSERT INTO #ciudad VALUES (3,3,NULL,'Pekin')
  30.  
  31. SELECT continente,pais, COUNT(ci.id) AS ciudades FROM #continente AS C
  32. LEFT JOIN #pais AS p ON (c.id=p.id_continente)
  33. LEFT JOIN #ciudad AS ci ON (ci.id_pais=p.id AND ci.id_continente=c.id)
  34. GROUP BY continente,pais

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 21/06/2012, 09:31
 
Fecha de Ingreso: junio-2012
Mensajes: 2
Antigüedad: 11 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Doble left outer join SQL Server

Muchísimas gracias,

Ahora funciona perfectamente
  #4 (permalink)  
Antiguo 21/06/2012, 10:16
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Doble left outer join SQL Server

de nada :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: server, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:36.