Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Consulta con inner join (https://www.clubdelphi.com/foros/showthread.php?t=66288)

juanjo123 11-02-2010 18:29:08

Consulta con inner join
 
Hola a Todos,

tengo la siguente consulta
tabla a = 5.200 registros
tabla b = 24.000 registros

Código SQL [-]
SELECT b.codcontrato, a.orden, a.nif, CONCAT(a.apellido1,' ', a.apellido2,', ',a.nombre) as nombrecompleto, b.fechavencont, b.fechabaja 
FROM personal a 
INNER JOIN contratos b on a.orden=b.orden
WHERE a.codempresa='301' 
ORDER BY a.orden asc

y necesito que se muestren los que tengan tambien "a.orden=0", he probada de todas las formas posibles con and,or por todos lados sin exito, porque o me los muestra duplicados ó me muestra 24.000 registro cuando deben de ser 5200

Agradeceria toda ayuda o critica
Gracias

delphi.com.ar 11-02-2010 19:50:22

Cita:

Empezado por juanjo123 (Mensaje 353692)
...necesito que se muestren los que tengan tambien "a.orden=0"...

¿Quieres los que se cumplan la relación, mas los que estén en cero?
En ese caso se me ocurre que podrías hacer dos consultas con un union

Código SQL [-]
SELECT b.codcontrato, a.orden, a.nif, CONCAT(a.apellido1,' ', a.apellido2,', ',a.nombre) as nombrecompleto, 
     b.fechavencont, b.fechabaja
FROM personal a 
INNER JOIN contratos b on a.orden=b.orden
WHERE a.codempresa='301' 
UNION ALL 
SELECT NULL, orden, nif, CONCAT(apellido1,' ', apellido2,', ',nombre) as nombrecompleto, 
     NULL, NULL 
FROM personal
WHERE a.codempresa='301' 
ORDER BY 2 asc

Ahora si lo que quieres son todos los registros de la tabla "personal" sin importar si estos tienen o no un "contrato", lo que debes hacer es un LEFT JOIN:

Código SQL [-]
SELECT b.codcontrato, a.orden, a.nif, CONCAT(a.apellido1,' ', a.apellido2,', ',a.nombre) as nombrecompleto, 
     b.fechavencont, b.fechabaja 
FROM personal a 
LEFT JOIN contratos b on a.orden=b.orden
WHERE a.codempresa='301' 
ORDER BY a.orden asc


Saludos!

juanjo123 11-02-2010 20:37:26

Muchas garcias, delphi.com.ar la segunda me ha ido perfecta.


Perdonar que siga abusando. (las cosas de los novatos)
Algun consejo de como obtimizar esta consulta

Código SQL [-]
SELECT b.codcontrato, a.orden, a.nif, CONCAT(a.apellido1,' ', a.apellido2,', ',a.nombre) as nombrecompleto, b.fechavencont, b.fechabaja 
FROM personal a
LEFT join contratos b on a.orden=b.orden 
where (a.codempresa='901' OR a.codempresa='902' OR a.codempresa='904' OR a.codempresa='905' OR a.codempresa='906' OR a.codempresa='907') 
and (b.fechabaja Is Null or b.fechabaja='0000-00-00') and a.orden<>'0' 
ORDER BY nombrecompleto

Un saludo a todo el foro

delphi.com.ar 11-02-2010 22:34:16

Si cada tabla tiene sus índices respectivos, la consulta no es imperformante en absoluto. Lo único que resulta algo raro es porque tienes que preguntar empresa por empresa, desconociendo lo que quieres hacer con la consulta... ¿Esas empresas pertenecen a un grupo que puedas normalizar?... .asi preguntas algo como:
Código SQL [-]
and a.campo = valor

Si no puede ser así, porque es algo que elijes desde el front-end, por una cuestión estética, y de mas fácil lectura utilizaría la cláusula IN:
Código SQL [-]
where a.codempresa IN ('901', '902', '904', '905', '906', '907')

Saludos!


La franja horaria es GMT +2. Ahora son las 07:10:29.

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