PDA

Ver la Versión Completa : Consulta con inner join


juanjo123
11-02-2010, 18:29:08
Hola a Todos,

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


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
...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


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:


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


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:

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:

where a.codempresa IN ('901', '902', '904', '905', '906', '907')


Saludos!