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

ayudenme a solucionar este problema

Estas en el tema de ayudenme a solucionar este problema en el foro de Mysql en Foros del Web. error 1473 too high level for nesting for select Alguien me podria decir 1. pork me da ese error, es decir en unas maquinas me ...
  #1 (permalink)  
Antiguo 25/05/2010, 15:18
 
Fecha de Ingreso: marzo-2010
Mensajes: 26
Antigüedad: 14 años, 1 mes
Puntos: 0
ayudenme a solucionar este problema

error 1473 too high level for nesting for select

Alguien me podria decir
1. pork me da ese error, es decir en unas maquinas me la ejecuta muy bien pero en otras no.
2 A k se debe y como lo puedo solucionar

necesito ayuda plis..............
no se k hacer
recomendaciones
  #2 (permalink)  
Antiguo 25/05/2010, 16:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ayudenme a solucionar este problema

Traducción:
Cita:
Número demasiado alto de selects anidados (recursivos).
Deberías postear la consulta que generó este error y la versión de MySQL usada. Sin eso, estaríamos adivinando.

Y, por favor, acuérdate que no estás escribiendo SMS. Aquí no te cobran más por escribir con todas las letras...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 25/05/2010, 20:15
 
Fecha de Ingreso: marzo-2010
Mensajes: 26
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: ayudenme a solucionar este problema

O.k este es el codigo k estoy tratando de ejecutar, y la version de mysql es la 5.1.37

Código:
DELIMITER $$
CREATE PROCEDURE  `sivipcan`.`spRptIvaa_municipio`(pIdUnidad CHAR(2),pDateUno DATETIME, pDateDos DATETIME)
BEGIN		SELECT papsAntUno,	papsAntDos,	papsAntTres, papsAntCuatro,	papsAntCinco, ivaaUno, 
        ivaaUnoPR,	ivaaUnoNR,	ivaaUnoMedico,	ivaaUnoEnf,	ivaaUnoAux,	ivaaUnoEsp,	ivaaUnoCA,	
        crioUno, asaTermUno, referidaUno, AStxUno, ivaaDos, ivaaDosPR,	ivaaDosNR,	ivaaDosMedico,	
        ivaaDosEnf,	ivaaDosAux,	ivaaDosEsp,	ivaaDosCA,crioDos,asaTermDos,	referidaDos,	
        AStxDos,ivaaTres,	ivaaTresPR,	ivaaTresNR,	ivaaTresMedico,	ivaaTresEnf,ivaaTresAux,
        ivaaTresEsp,ivaaTresCA,	crioTres,	asaTermTres,	referidaTres,	AStxTres,	ivaaCuatro,
        ivaaCuatroPR,ivaaCuatroNR,ivaaCuatroMedico,	ivaaCuatroEnf,	ivaaCuatroAux,	ivaaCuatroEsp,	
        ivaaCuatroCA,crioCuatro,asaTermCuatro,	referidaCuatro,	AStxCuatro,	ivaaCinco,	ivaaCincoPR,	
        ivaaCincoNR,ivaaCincoMedico,ivaaCincoEnf,ivaaCincoAux,ivaaCincoEsp,	ivaaCincoCA,	
        crioCinco,asaTermCinco,	referidaCinco, AStxCinco FROM
		(SELECT (SELECT COUNT(*) FROM (SELECT n_expediente FROM vw_rpt_ivaa 
        WHERE id_tipo_examen = 1 AND edad_paciente > 24 AND edad_paciente < 30 AND id_municipio = pIdUnidad AND  
        fecha_examen BETWEEN pDateUno AND pDateDos) AS tblPapsUno) AS papsAntUno,
        (SELECT COUNT(*) FROM (SELECT n_expediente FROM vw_rpt_ivaa 
        WHERE id_tipo_examen = 1 AND edad_paciente > 29 AND edad_paciente < 35 AND id_municipio = pIdUnidad AND 
        fecha_examen BETWEEN pDateUno AND pDateDos) AS tblPapsDos) AS papsAntDos,
        (SELECT COUNT(*) FROM (SELECT n_expediente FROM vw_rpt_ivaa 
        WHERE id_tipo_examen = 1 AND edad_paciente > 34 AND edad_paciente < 40 AND id_municipio = pIdUnidad AND 
        fecha_examen BETWEEN pDateUno AND pDateDos) AS tblPapsTres) AS papsAntTres,
        (SELECT COUNT(*) FROM (SELECT n_expediente FROM vw_rpt_ivaa 
        WHERE id_tipo_examen = 1 AND edad_paciente > 39 AND edad_paciente < 45 AND id_municipio = pIdUnidad AND 
        fecha_examen BETWEEN pDateUno AND pDateDos) AS tblPapsCuatro) AS papsAntCuatro,
        (SELECT COUNT(*) FROM (SELECT n_expediente FROM vw_rpt_ivaa 
        WHERE id_tipo_examen = 1 AND edad_paciente > 45 AND edad_paciente < 50 AND id_municipio = pIdUnidad AND 
        fecha_examen BETWEEN pDateUno AND pDateDos) AS tblPapsCinco) AS papsAntCinco,
        
        (SELECT COUNT(*)FROM (SELECT n_expediente, COUNT(*) FROM vw_rpt_ivaa WHERE id_tipo_examen = 2 
        AND edad_paciente > 24 AND edad_paciente < 30 AND id_municipio = pIdUnidad AND  
        fecha_examen BETWEEN pDateUno AND pDateDos GROUP BY n_expediente HAVING count(*) < 2 AND 
        COUNT(*) > 0) AS tblIvaaUno) AS ivaaUno,
        (SELECT COUNT(*)FROM (SELECT n_expediente, COUNT(*) FROM vw_rpt_ivaa WHERE id_tipo_examen = 2 
        AND edad_paciente > 24 AND edad_paciente < 30  AND id_pos_resultado = 58 AND id_municipio = pIdUnidad AND 
        fecha_examen BETWEEN pDateUno AND pDateDos GROUP BY n_expediente HAVING count(*) < 2 AND 
        COUNT(*) > 0) AS tblIvaaUnoPR) AS ivaaUnoPR,
        (SELECT COUNT(*)FROM (SELECT n_expediente, COUNT(*) FROM vw_rpt_ivaa WHERE id_tipo_examen = 2 
        AND edad_paciente > 24 AND edad_paciente < 30  AND id_pos_resultado = 59 AND id_municipio = pIdUnidad AND 
        fecha_examen BETWEEN pDateUno AND pDateDos GROUP BY n_expediente HAVING count(*) < 2 AND 
        COUNT(*) > 0) AS tblIvaaUnoNR) AS ivaaUnoNR, 
   
        (SELECT COUNT(*)FROM (SELECT n_expediente, COUNT(*) FROM vw_rpt_ivaa WHERE id_tipo_examen = 2 
        AND edad_paciente > 24 AND edad_paciente < 30 AND id_municipio = pIdUnidad AND 
        id_cargo = 6 OR id_cargo = 7 AND fecha_examen BETWEEN pDateUno AND pDateDos GROUP BY n_expediente HAVING count(*) < 2 AND 
        COUNT(*) > 0) AS tblIvaaUnoMedico) AS ivaaUnoMedico,
        (SELECT COUNT(*)FROM (SELECT n_expediente, COUNT(*) FROM vw_rpt_ivaa WHERE id_tipo_examen = 2 
        AND edad_paciente > 24 AND edad_paciente < 30 AND id_municipio = pIdUnidad AND 
        id_cargo = 5 AND fecha_examen BETWEEN pDateUno AND pDateDos GROUP BY n_expediente HAVING count(*) < 2 AND 
        COUNT(*) > 0) AS tblIvaaUnoEnf) AS ivaaUnoEnf
y falta aun mas pero por espacio no pude agregarlo y es k es enorme
  #4 (permalink)  
Antiguo 25/05/2010, 20:37
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 1 mes
Puntos: 15
De acuerdo Respuesta: ayudenme a solucionar este problema

- Segun como lo veo, tu consulta debe listas la lista de elementos con ID = ?, entre las fechas X y Y.

- Segun lo que dice MySQL se debe a la cantidad de anidaciones.(Demasiadas anidaciones-supera lo soportado por MySQl).

La idea de un procedimiento almacenado no creo que sea esta, desde el punto de analisis deberia ser un poco mas organizado...ya que cuando haya que depurar un error de datos logicos, o calculados, sera un verdadero dolor de cabeza(No se cuenta con paso a paso a menos que utilizemos embarcaderoDB u otros.).

RECOMENDACION:
Te ayudaria a dar un poco de organizacion, y muy probablemente solucione el problema las siguientes recomendaciones:

1. Crear funciones y vistas.
2. Crear SP's que se invoquen desde el principal.
3. Crear mensajes y validacion de errores entre la invocaciones de cada SP Auxiliar.
4. Establecer busquedas a nivel de indices.
5. utilizar tablas temporales.
6. Utiliza estructuras.
7. RECOMENDACION: Evita en lo posible utilizar cursores.

DELIMITER $$
CREATE PROCEDURE XXX(...)
BEGIN
...
SELECT CASE ... WHEN ... THEN
WHEN ... THEN '...' ELSE '...' END;

Call sp_Auxiliar1(...);
Call sp_Auxiliar2(...);
Call sp_Auxiliar3(...);

END
DELIMITER $$


Un saludo,
  #5 (permalink)  
Antiguo 25/05/2010, 21:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ayudenme a solucionar este problema

Bueno, si eso es lo que estás tratando de hacer, entonces el problema es muy obvio: Tu consulta contiene demasiadas subconsultas, cada una con una subconsulta anidada.
Es innecesario y terriblemente ineficiente. Estás recargando al parser a morir...

La única solución que tienes es replantearte toda la consulta, porque obviamente se puede hacer de otro modo.

Te doy una ayuda: Estas contando cantidades de instancias en las que se cumple un conjunto de condiciones, por lo que en realidad es posible que cada ocasión esté barriendo toda la tabla.
¿Por qué no hacer, entonces, que la recorra una sola vez?:

Código MySQL:
Ver original
  1.   SUM(IF(id_tipo_examen = 1 AND edad_paciente > 24 AND edad_paciente < 30 , 1, 0)) papsAntUno,
  2.   SUM(IF(id_tipo_examen = 1 AND edad_paciente > 29 AND edad_paciente < 35 , 1, 0)) papsAntDos,
  3.   SUM(IF(id_tipo_examen = 1 AND edad_paciente > 34 AND edad_paciente < 40 , 1, 0)) papsAntTres,
  4.   SUM(IF(id_tipo_examen = 1 AND edad_paciente > 39 AND edad_paciente < 45 , 1, 0)) papsAntCuatro,
  5.   SUM(IF(id_tipo_examen = 1 AND edad_paciente > 45 AND edad_paciente < 50, 1, 0)) papsAntCinco,
  6.   /* Aquí irían los siguientes casos hasta completar los resultados */
  7.  
  8. FROM vw_rpt_ivaa
  9.   id_municipio = pIdUnidad AND
  10.   fecha_examen BETWEEN pDateUno AND pDateDos;

Tips:

- AS es una cláusula obsoleta que sólo se conserva por compatibilidad. Es innecesaria.

- No abuses de las subconsultas. No tiene sentido usarlas para crear un sólo valor, el cual puede ser obtenido de una función almacenada (sería más práctico). Una subconsulta tiene más sentido si la vas a usar para obtener un conjunto de registros.

- Los rangos de edades como los has puesto son funcionales, pero es más óptimo usar BETWEEN para eso:

Código MySQL:
Ver original
  1. SUM(IF(id_tipo_examen = 1 AND edad_paciente BETWEEN 25 AND 29 , 1, 0)) papsAntUno,
  2.   SUM(IF(id_tipo_examen = 1 AND edad_paciente BETWEEN 30 AND 34 , 1, 0)) papsAntDos,
  3.   SUM(IF(id_tipo_examen = 1 AND edad_paciente BETWEEN 35 AND 39 , 1, 0)) papsAntTres,
  4.   SUM(IF(id_tipo_examen = 1 AND edad_paciente BETWEEN 40 AND 44 , 1, 0)) papsAntCuatro,
  5.   SUM(IF(id_tipo_examen = 1 AND edad_paciente BETWEEN 45 AND 49, 1, 0)) papsAntCinco,

Puede parecer lo mismo, pero para MySQL es más eficiente de ese modo, porque internamente la implementación del BETWEEN usa diferentes métodos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: Ninguno
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 05:27.