Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Problemas con Inner Join y operador AS (https://www.clubdelphi.com/foros/showthread.php?t=56978)

enecumene 02-06-2008 18:49:42

Problemas con Inner Join y operador AS
 
Saludos compañeros, miren estoy teniendo problemas con inner join, pues no me reconoce el operador AS, hice esta sentencia que es la primera vez que uso inner join intentando unir varias tablas para un reporte:

Código SQL [-]
SELECT REGISTRO.EMPLEADO, REGISTRO.ENTRADA, REGISTRO.SALIDA, REGISTRO.FECHA FROM REGISTRO INNER JOIN
TARDANZAS ON REGISTRO.EMPID = TARDANZAS.EMPID AS TA INNER JOIN PERMISOS ON REGISTRO.EMPID = PERMISOS.EMPID
AS PE INNER JOIN LICENCIAS ON REGISTRO.EMPID = LICENCIAS.EMPID AS LI INNER JOIN EXCUSAS ON REGISTRO.EMPID = EXCUSAS.EMPID AS EX
INNER JOIN ENFERMEDAD ON REGISTRO.EMPID = ENFERMEDAD..EMPID AS ENF INNER JOIN VACACIONES ON REGISTRO.EMPID = VACACIONES.EMPID AS VA WHERE REGISTRO.FECHA = '02/06/2008'

este es el error:

Cita:

---------------------------
Error
---------------------------
SQL Error: Dynamic SQL Error SQL error code = -104 Token unknown - line 2, column 47 AS. Error Code: -104. Invalid token The SQL: ...bla, bla, bla
---------------------------
OK
---------------------------

Estoy usando ZEOS y Firebird 2.0

Saludos.

ContraVeneno 02-06-2008 18:54:50

no se en interbase, pero en SQL Server, la sintaxis es así:

Código SQL [-]
Select campos
From Tabla T
join otraTabla OT on T.ID = OT.ID

vamos, que el alias de la tabla va después del nombre, no al final del join.

enecumene 02-06-2008 19:15:59

¡Changos! :p:p, Vale, gracias me funcionó a la perfección, por favor sácame de otra duda, entre el select y el from puedo llamar los campos de las tablas de los join?.

Saludos.

Delphius 02-06-2008 19:30:18

Cita:

Empezado por enecumene (Mensaje 290775)
¡Changos! :p:p, Vale, gracias me funcionó a la perfección, por favor sácame de otra duda, entre el select y el from puedo llamar los campos de las tablas de los join?.

Saludos.

Hola enecumene, ¿A que te rifieres con llamas los campos? ¿A alias?
La verdad es que no recuerdo si es válido en un JOIN, pero creo que no te problemas.

Saludos,

enecumene 02-06-2008 19:40:51

Cita:

Empezado por Delphius (Mensaje 290776)
Hola enecumene, ¿A que te rifieres con llamas los campos? ¿A alias?
La verdad es que no recuerdo si es válido en un JOIN, pero creo que no te problemas.

Saludos,

Bueno me refería a esta forma:

Código SQL [-]
select re.ID, ta.ID from registros re inner join tardanzas ta on re.ID = ta.ID

Saludos.

Delphius 02-06-2008 20:00:11

Fernando, claro que se puede. Es más, hasta con inner join anidados:

Código SQL [-]
select emp.FIRST_NAME, emp.LAST_NAME, pro.PROJ_NAME
from employee emp
inner join employee_project empj on emp.emp_no = empj.emp_no
inner join project pro on empj.proj_id = pro.proj_id

Saludos,

enecumene 02-06-2008 20:03:06

Muchas Gracias Marcelo por aclararme la duda.

Saludos.

Delphius 02-06-2008 20:12:31

Cita:

Empezado por enecumene (Mensaje 290783)
Muchas Gracias Marcelo por aclararme la duda.

Saludos.

De nada amigo.
Un placer ayudarte en lo que pueda.

Ya me extrañaría si no lo permitiera Firebird.
Saludos,

enecumene 03-06-2008 17:03:52

Hola, decidí cambiar el INNER JOIN por el LEFT OUTER JOIN ya que la primera no me daba resultados, la consulta queda así:

Código SQL [-]
SELECT DISTINCT(E.ID), E.NOMBRE, E.CARGO, E.TANDA, R.ENTRADA, R.SALIDA, T.ID, P.ID,
EX.ID, LI.ID, EN.ID, V.ID FROM EMPLEADOS E LEFT OUTER JOIN REGISTRO R ON E.ID = R.EMPID
LEFT OUTER JOIN TARDANZAS T ON E.ID = T.EMPID LEFT OUTER JOIN PERMISOS P ON E.ID = P.EMPID
LEFT OUTER JOIN EXCUSAS EX ON E.ID = EX.EMPID LEFT OUTER JOIN LICENCIAS LI ON E.ID = LI.EMPID
LEFT OUTER JOIN ENFERMEDAD EN ON E.ID = EN.EMPID LEFT OUTER JOIN VACACIONES V ON E.ID = V.EMPID WHERE R.FECHA = :Hoy

Me tira los resultados que quiero, pero hay datos que se repite dos veces, y no hay datos repetidos en la base, ¿qué se puede hacer?.

Saludos.

enecumene 03-06-2008 18:40:03

Bueno, resolví el problema de repetición, cambiandole algunos campos:

Código SQL [-]
SELECT DISTINCT(E.ID), E.NOMBRE, E.CARGO, E.TANDA, R.ENTRADA, R.SALIDA, T.EMPID, P.EMPID,
EX.EMPID, LI.EMPID, EN.EMPID, V.EMPID FROM EMPLEADOS E LEFT OUTER JOIN REGISTRO R ON E.ID = R.EMPID
LEFT OUTER JOIN TARDANZAS T ON E.ID = T.EMPID LEFT OUTER JOIN PERMISOS P ON E.ID = P.EMPID
LEFT OUTER JOIN EXCUSAS EX ON E.ID = EX.EMPID LEFT OUTER JOIN LICENCIAS LI ON E.ID = LI.EMPID
LEFT OUTER JOIN ENFERMEDAD EN ON E.ID = EN.EMPID LEFT OUTER JOIN VACACIONES V ON E.ID = V.EMPID WHERE R.FECHA = :Hoy

Pero ahora tengo otro tipo de problema (No salgo de una joder :mad::p), es que las tablas T,P,EX,LI,EN, y V, muestran el primer registro distinto al valor nulo ignorando completamente la condición where de la sentencia. Ejemplo:

Tabla Tardanzas (T):
Cita:

FECHA EMPID
02/06/2008----28
02/06/2008----31
03/06/2008----15
03/06/2008----21
Como ven hay 4 tardanzas en dos fechas, si hago la consulta en fecha 02/06/2008 en el reporte deberia de aparecerme solamente esas dos tardanzas, pero no, me salen las 4 :eek::eek:.

Saludos.


La franja horaria es GMT +2. Ahora son las 04:02:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi