PDA

Ver la Versión Completa : No consigo ejecutar una consulta sql


snowlis
19-04-2007, 14:26:13
Estoy haciendo una consulta sql en delphi sobre varias tablas que tengo en la misma carpeta. Otras consultas me las hace bien, pero la siguiente no, me da un error que dice : Invalid use of keyword token.
La he repasado mucho y yo creo que aparentemente esta bien, nose cual es el error :(

La consulta es esta :

SELECT M.NALBA,M.OBRA,M.FECHA,M.ORIGI,H.ALBA2,MO.DESC,MO.NOME,MO.CLIE,L.PARTE,L.TIPO,L.HORA1
FROM MAEALBA M INNER JOIN LINPRTS L ON L.NALBA=M.NALBA INNER JOIN MAEOBRA MO ON MO.OBRA=L.OBRA INNER JOIN HSTMOVI H ON H.OBRA=MO.OBRA
WHERE L.TIPO='E' AND M.FECHA > '9/30/2005';


Saludos ;)

gluglu
19-04-2007, 14:37:42
El error que te dá es porque estás utilizando una 'palabra clave' dentro de la consulta.

No has puesto que motor de BD utilizas. No sé decirte cual de las palabras que estás utilizando en tu consulta (que aparentemente está bien, según lo que he podido observar), puede ser una palabra clave para ese motor.

Cambia alguno de los 'alias' que utilizas en esa consulta, a ver si es eso.

Saludos, ;)

Lepe
19-04-2007, 14:47:14
Según el error que da, es que interpreta un nombre de campo o de tabla como una palabra reservada del lenguaje SQL (o al menos así lo interpreto yo ese error).

Si se trata de esto, deberías buscar información de tu motor de bases de datos, mirar las palabras reservadas que tenga, y ver si alguna está en tu SQL.

Un ejemplo: Si tienes un campo que se llama USERNAME, no podrás hacer sqls sobre ese campo, porque USERNAME es una palabra reservada de Interbase (por decir algo) y da conflicto al interpretar el SQL. Solución: cambiar el nombre del campo por USERSNAME o UNAME, etc.

No sé si podría ocurrir con el campo "MO.DESC". Desc es típico del order by para indicar un orden descendente, pero en principio, no debería haber problemas porque está cualificado, es decir, lleva "MO." delante, por tanto indica que es un campo perteneciente a la tabla MO. Quita ese campo del select y si no da error después, hemos acertado.

Como digo, no puedo asegurar que sea ese el error, pero es lo único que veo. El SQL parece estar bien.

OFFTOPIC: No me he sentido más inseguro de una respuesta en mi vida :D.

Edito: Al ver el mensaje de gluglu, ya me siento más seguro :p

Saludos

gluglu
19-04-2007, 15:00:03
Coincido con Lepe que puede ser el nombre del campo DESC que coincide con una palabra reservada que se puede incluir en el 'Order By' para ordenar el query en orden descendente.

basti
19-04-2007, 15:41:26
Coincido con Lepe y gluglu, la solución es o cambiar el nombre del campo o usar comillas dependiendo del motor de base de datos que uses, por ejemplo:

MO."DESC" si es paradox, MO.`DESC` en MySQL, estos son los que recuerdo de memoria.

snowlis
19-04-2007, 18:06:44
He probado a quitar el campo mo.desc y al ejecutar el programa en delphi ahora no me sale ningun error, pero cuando voy a ejecutar la consulta se queda como colgado y se me cuelga el ordenador.

Y si esa misma consulta la intento ejecutar en access quitando lo del mo.desc, me sale el mismo error : error de sintaxis (falta operador) en la expresión de consulta.

Las tablas sobre las que trabajo son archivos dbf que tengo todos en una misma carpeta dentro del programa y solamente uso un dataset, un query y un dbgrid para mostrar la consulta.

Lo único que se me ocurre es que sea normal que tarde tanto porque por ejemplo una consulta tan simple como esta :
SELECT M.NALBA,H.ALBA2 FROM MAEALBA M INNER JOIN HSTMOVI H ON M.OBRA=H.OBRA;

Con eso ya le cuesta un poco, casi 1 minuto, ya que estamos hablando con tablas con muchos registros (hstmovi tiene más de 76000 registros y maemovi más de 37000).

Puff, es que es tal la lentitud que en delphi una consulta como esa se me cuelga el pc, en access por lo menos le cuesta pero la ejecuta.

hach
19-04-2007, 18:44:59
aunque hace rato que no trabajo en access, creo que necesita parentesis en los join, quedaria asi:
le saque el campo DESC porque tambien creo que te traera problemas...


SELECT M.NALBA,M.OBRA,M.FECHA,M.ORIGI,H.ALBA2
, MO.NOME,MO.CLIE,L.PARTE,L.TIPO,L.HORA1
FROM (((MAEALBA M
INNER JOIN LINPRTS L ON L.NALBA=M.NALBA)
INNER JOIN MAEOBRA MO ON MO.OBRA=L.OBRA)
INNER JOIN HSTMOVI H ON H.OBRA=MO.OBRA)
WHERE L.TIPO='E' AND M.FECHA > '9/30/2005';



tambien puedes probar sin los INNER JOIN


SELECT M.NALBA,M.OBRA,M.FECHA,M.ORIGI,H.ALBA2
, MO.NOME,MO.CLIE,L.PARTE,L.TIPO,L.HORA1
FROM MAEALBA M, LINPRTS L, MAEOBRA MO, HSTMOVI H
WHERE M.FECHA > '9/30/2005'
AND L.NALBA=M.NALBA AND L.TIPO='E'
AND MO.OBRA=L.OBRA
AND H.OBRA=MO.OBRA




Espero que te sea de ayuda...
Saludos

hach
19-04-2007, 18:47:50
En cuanto a la lentitud...
Todas las tablas tienen indices por los campos intervinientes en los join?

snowlis
19-04-2007, 19:03:38
Gracias Hach por las consultas, las probaré ;)

En cuanto a los indices no los tengo, solo tengo en la carpeta los archivos de delphi y los DBF.

Creo que también tenía los indices NT1,NT2 y NT3 pero los borré porque me di cuenta que el delphi se los pasaba por el forro y creo que no servía para nada, pero igual me equivoco. Si se los pongo, las consultas iran más rápidas o en que influye tener los indices o no ?

hach
19-04-2007, 19:14:21
los indices son indispensables!!!!
estas andando en auto con el freno de mano puesto!!! je

para esta consulta en particular necesitas tener los siguientes indices

SELECT M.NALBA,M.OBRA,M.FECHA,M.ORIGI,H.ALBA2
, MO.NOME,MO.CLIE,L.PARTE,L.TIPO,L.HORA1
FROM MAEALBA M, LINPRTS L, MAEOBRA MO, HSTMOVI H
WHERE M.FECHA > '9/30/2005'
AND L.NALBA=M.NALBA AND L.TIPO='E'
AND MO.OBRA=L.OBRA
AND H.OBRA=MO.OBRA

MAEALBA : fecha, nalba
LINPRTS : nalba, tipo, obra
MAEOBRA : obra
HSTMOVI : obra

esto es lo ideal, veras la diferencia de velocidad