Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Duda en Comando SQL (https://www.clubdelphi.com/foros/showthread.php?t=54790)

paladincubano 31-03-2008 11:24:47

Duda en Comando SQL
 
Hola foreros, tengo la siguiente clausula SQL en delphi:

Código SQL [-]SELECT A.*,B.*,C.*,D.* FROM Inscripciones A,Clientes B,Cursos C, Facturas D
WHERE A.idCliente=B.idCliente
AND A.idCurso=C.idCurso
AND C.AliasCurso=xxxxxxxxxxxxxxxx
AND (A.idFactura=D.idFactura)
ORDER BY A.idInscripcion


Esto me retorna todos los datos que quiero, todos los clientes inscritos en el curso xxxxxxxxx que tenga su factura, pero tambien quiero que me retorne A.idFactura is Null, osea, los clientes inscritos que no tienen facturas. Cuando puse esta linea (AND A.idFactura=D.idFactura or A.idFactura is Null) me retorno miles de nombres repetidos y cantidad de cosas extranas)
Las tablas son.
Clientes: idCliente, nombre, apllidos, etc.
Inscriciones: idCliente, idCurso, idFactura, precio, etc.
Cursos: idCurso, nombrecurso, etc.
Facturas: idCliente, idfactura, valor, aliasfactura, etc

gracias por todo.

iuqrul 31-03-2008 11:33:39

Prueba esto:

SELECT A.*,B.*,C.*,D.*
FROM Inscripciones A,Clientes B,Cursos C
left join Facturas D on (A.idFactura=D.idFactura)
WHERE A.idCliente=B.idCliente
AND A.idCurso=C.idCurso
AND C.AliasCurso=xxxxxxxxxxxxxxxx
ORDER BY A.idInscripcion


Piensa que usando join (más claro y recomendable aunque se escribe más), tu consulta equivale a:


SELECT A.*,B.*,C.*,D.*
FROM Inscripciones A
join Clientes B on (A.idCliente=B.idCliente)
join Cursos C on (A.idCurso=C.idCurso)
left join Facturas D on (A.idFactura=D.idFactura)
WHERE C.AliasCurso=xxxxxxxxxxxxxxxx
ORDER BY A.idInscripcion

paladincubano 31-03-2008 11:38:06

Muchas gracias,
he probado lo que me dices y cuando intento activar el Query me da el error:

El identificador formado por varias partes "A.idFactura" no se pudo enlazar.

paladincubano 31-03-2008 11:47:40

Bueno, de momento he probado el segundo caso que me distes y ese si que ha funcionado. El primero no se el porque.
Ahora, me habian dicho que el JOIN era lo mismo que el select por eso no usaba el JOIN porque habia aprendido a hacerlo todo con el select, pero busando info me he encontrado que el LEFT JOIN tambien te devuelve lso valores nulos, es eso lo que hace no?
Muchas gracias, eres un crack, jejeje.

iuqrul 31-03-2008 11:56:32

Al seleccionar las tablas separadas por comas, la base de datos entiende que son todos INNER JOIN, pero tú necesitabas en esa relación un LEFT JOIN, que trae todos los registros de la izquierda (Inscripciones), aunque la tabla Facturas (virtualmente a la derecha) no esté vinculada por el campo idFactura.

Respecto a la primera consulta, es un error mio, no se puede mezclar selección de tablas por comas con join, el segundo SQL funciona porque todo está relacionado con join. Lo hice para no soltarte el churro de join a la primera, pero en este caso es necesario.

Me alegro que se resuelva tu problema.

paladincubano 31-03-2008 11:59:55

pues hombre muchas gracias por todo.
Hoy cuando llegue a casa pues me estudiare bien los join y creo que voy a empezar a usarlos en vez de los select (a no ser que sea algo sencillo, creo).
Otras vez mas gracias por todo.


La franja horaria es GMT +2. Ahora son las 01:33:21.

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