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

traducci'on query MS Access -> MySQL no funciona

Estas en el tema de traducci'on query MS Access -> MySQL no funciona en el foro de Bases de Datos General en Foros del Web. Buenas, tengo esta query en access UPDATE tablaA INNER JOIN ( tablaB INNER JOIN tablaC ON (tablaB.Alias=tablaC.Alias) AND (tablaB.TempRepDate=tablaC.PlayDate) ) ON (tablaA.[Client Login]=tablaB.[loginName]) AND (tablaA.[Client ...
  #1 (permalink)  
Antiguo 14/07/2010, 03:11
 
Fecha de Ingreso: noviembre-2008
Mensajes: 65
Antigüedad: 16 años
Puntos: 0
traducci'on query MS Access -> MySQL no funciona

Buenas, tengo esta query en access

UPDATE tablaA
INNER JOIN (
tablaB
INNER JOIN tablaC
ON (tablaB.Alias=tablaC.Alias)
AND (tablaB.TempRepDate=tablaC.PlayDate)
)
ON (tablaA.[Client Login]=tablaB.[loginName])
AND (tablaA.[Client Login]=tablaB.[loginName])
SET tablaB.campo = ([0]+((tablaB.Originalcampo-[0])*(1-[0])))
WHERE (((tablaB.Updated)=No));

(donde pone creo, va una variable) y la he traducido a MySQL as'i

UPDATE tablaA a
INNER JOIN (
tablaB b
INNER JOIN tablaC c
ON b.Alias=c.Alias
AND b.TempRepDate=c.PlayDate
)
ON a.`Client Login`=b.`loginName`
AND a.`Client Login`=b.`loginName`
SET b.campo = 0+((b.Originalcampo-0)*(1-0))
WHERE b.Updated=FALSE;

El tema es que en Access tarda unos dos segundos y en MySQL se puede tirar seis horqas y no acabar.

Alguien me puede ocrregir algo o al menos orientarme?

Muchas gracias!
Luis
  #2 (permalink)  
Antiguo 14/07/2010, 05:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: traducci'on query MS Access -> MySQL no funciona

Probemos:
Código MySQL:
Ver original
  1. UPDATE tablaA a
  2.     INNER JOIN (SELECT * FROM tablaB WHERE NOT Updated) ON a.`Client Login`=b.`loginName`
  3.     INNER JOIN tablaC c ON (b.Alias=c.Alias AND b.TempRepDate=c.PlayDate)
  4. SET b.campo = 0+((b.Originalcampo-0)*(1-0));

o bien:

Código MySQL:
Ver original
  1. UPDATE tablaA a
  2.     INNER JOIN tablaB b ON a.`Client Login`=b.`loginName`
  3.     INNER JOIN tablaC c ON (b.Alias=c.Alias AND b.TempRepDate=c.PlayDate)
  4. SET b.campo = 0+((b.Originalcampo-0)*(1-0))
  5. WHERE NOT Updated;

Por lo pronto, habías puesto dos veces esta condición:
Código MySQL:
Ver original
  1. ON a.`Client Login`=b.`loginName`
Por otro, en MySQL, las condiciones del INNER JOIN se deben poner a continuación de cada INNER JOIN y no todas al final. Le facilita el parseo.
Además, Si ya tienes una condición de filtrado aplicable sobre una única tabla, es mejor resolverla sobre una subconsulta, ya que abrevia el tiempo de respuesta, especialmente si es una condición de alta selectividad. No te olvides que el WHERE es el último en ser evaluado por lo que para ese momento has debido leer toda la tabla B inútilmente.

En cualquier caso lo que te conviene es ir construyendo la sentencia parte a parte, para asegurarte qué JOIN o qué condición es la que produce mayor retraso; habitualmente esa será la condición o JOIN que tenga muy baja selectividad, o bien donde sea conveniente definir índices.

El WHERE NOT Updated lo pongo de esa forma porque si es un booleano, la negación del FALSE devuelve TRUE, que es igual a lo que pones, pero más eficiente porque no hace comparaciones entre dos valores.
__________________
¿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 14/07/2010, 05:59
 
Fecha de Ingreso: noviembre-2008
Mensajes: 65
Antigüedad: 16 años
Puntos: 0
Respuesta: traducci'on query MS Access -> MySQL no funciona

joder, gnzsoloyo, mil gracias. A esto le voy a dar un par de vueltas antes de hacerlo o siquiera contestar, que tiene un rato...

Etiquetas: access, mysql, query
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 14:22.