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!
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.