Ver Mensaje Individual
  #5 (permalink)  
Antiguo 27/06/2011, 13:58
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 5 meses
Puntos: 447
Respuesta: Problema con count(*) de registros de tablas

Hola estre07:

Prueba con esto

Código SQL:
Ver original
  1. DECLARE @ANIMALES TABLE (id_animal INT, descripcion VARCHAR(20), ubicacion VARCHAR(10))
  2. INSERT INTO @ANIMALES VALUES (1, 'Animal uno', 'EDO.MEX')
  3. INSERT INTO @ANIMALES VALUES (2, 'Animal dos', 'EDO.MEX')
  4. INSERT INTO @ANIMALES VALUES (3, 'Animal tres', 'EDO.MEX')
  5. INSERT INTO @ANIMALES VALUES (4, 'Animal cuatro', 'EDO.MEX')
  6. INSERT INTO @ANIMALES VALUES (5, 'Animal cinco', 'EDO.MEX')
  7. INSERT INTO @ANIMALES VALUES (6, 'Animal seis', 'EDO.MEX')
  8.  
  9. DECLARE @PERROS TABLE (id_perro INT, descripcion VARCHAR(20))
  10. INSERT INTO @PERROS VALUES (1, 'Perro uno')
  11. INSERT INTO @PERROS VALUES (2, 'Perro dos')
  12. INSERT INTO @PERROS VALUES (5, 'Perro cinco')
  13.  
  14. DECLARE @GATOS TABLE (id_gato INT, descripcion VARCHAR(20))
  15. INSERT INTO @GATOS VALUES (3, 'Gato tres')
  16. INSERT INTO @GATOS VALUES (4, 'Gato cuatro')
  17.  
  18.  
  19. SELECT COUNT(*) FROM @ANIMALES A
  20. INNER JOIN @PERROS P ON
  21. A.ID_ANIMAL=P.ID_PERRO WHERE UBICACION LIKE 'EDO.MEX'
  22.  
  23.  
  24. SELECT COUNT(*) FROM @ANIMALES A
  25. INNER JOIN  @GATOS G ON
  26. A.ID_ANIMAL=G.ID_GATO WHERE UBICACION LIKE 'EDO.MEX'
  27.  
  28. SELECT COUNT(*) FROM @ANIMALES A
  29. LEFT JOIN @PERROS P ON
  30. A.ID_ANIMAL=P.ID_PERRO
  31. LEFT JOIN  @GATOS G ON
  32. A.ID_ANIMAL=G.ID_GATO
  33. WHERE UBICACION LIKE 'EDO.MEX' AND
  34. (EXISTS (SELECT ID_PERRO FROM @PERROS WHERE a.id_animal = id_perro) OR
  35. EXISTS (SELECT ID_GATO FROM @GATOS WHERE a.id_animal = id_gato))
  36.  
  37. SELECT SUM(cuenta)
  38. FROM
  39. (SELECT COUNT(*) AS cuenta FROM @ANIMALES A INNER JOIN @PERROS P ON
  40. A.ID_ANIMAL=P.ID_PERRO WHERE UBICACION LIKE 'EDO.MEX'
  41. UNION
  42. SELECT COUNT(*) AS cuenta FROM @ANIMALES A INNER JOIN @GATOS G ON
  43. A.ID_ANIMAL=G.ID_GATO WHERE UBICACION LIKE 'EDO.MEX') T

La parte del EXISTS en el WHERE es sólo por si tuvieras algún id_animal que no exista ni en la tabla de PERROS ni en la tabla de GATOS (en el ejemplo sería el id_animal = 6), pero podrías omitirla si tienes la seguridad de que el id_animal exista en al menos una de las dos tablas.

En la consulta que te propone el compañero estre07 lo único que falta es asignarle un alias a la consulta que hace la UNION.

Es cuestión que pruebes ambas soluciones para que veas cual es más eficiente.

Saludos
Leo.