Left Join muy simple...

20/06/2005 - 15:46 por David Perona | Informe spam
Hola a todos,
A ver si alguien me puede aclarar una duda que tengo.

Tengo una tabla de máquinas y otra de pólizas que pueden tener estas
máquinas. La primera, tiene como clave primaria los campos codemp y
codmaquina. La segunda, codemp, codmaquina y codcompañia.

Pues bien, necesito una consulta para obtener todas las máquinas,
independientemente de si tienen polizas asociadas o no. En la base de datos,
tengo un único registro en la tabla máquinas, y ninguno en la tabla pólizas.

Hasta hoy, tenia esta consulta:

SELECT P.CODEMP AS CODEMP_POLIZA, M.CODEMP AS CODEMP_MAQUINA, M.* FROM
MAQUINAS M
LEFT JOIN POLIZAS P ON M.CODMAQUINA = P.CODMAQUINA
WHERE M.CODEMP = '20'
AND (P.CODEMP = '20' OR P.CODEMP IS NULL)

Pues resulta que esta consulta no me muestra el registro de la tabla
máquina. Si en cambio, añado en la clausula ON la unión de los campos CODEMP
de ambas tablas, y quito el último AND de la clausula WHERE, la consulta se
comporta como es de esperar. Devuelve todos los datos de la tabla máquinas, y
con valor NULL, los campos correspondientes a la tabla Pólizas.
Entiendo que la sintaxis correcta para esta consulta es como os acabo de
contar, especificando en la clausula ON todos los campos que conforme la
clave principal en la tabla de la izquierda. Pero por otros motivos,
necesitamos montar la consulta de esta manera.

Pues bueno, despues de todo el tostón, alguien podría decirme porque se
comporta asi? No debería ser lo mismo igualar los campos clave en el apartado
ON, que filtrar luego los valores posibles de los campos en el apartado WHERE?

Muchas Gracias a TODOS, por haber leido hasta aqui ;)
 

Leer las respuestas

#1 Alejandro Mesa
20/06/2005 - 16:14 | Informe spam
Pues bien, necesito una consulta para obtener todas las máquinas,
independientemente de si tienen polizas asociadas o no. En la base de datos,
tengo un único registro en la tabla máquinas, y ninguno en la tabla pólizas.



Todas las maquinas de la empresa "codemp = 20", independientemente de que
tengan poliza o no.

SELECT
P.CODEMP AS CODEMP_POLIZA,
M.CODEMP AS CODEMP_MAQUINA,
M.*
FROM
MAQUINAS as M
LEFT JOIN
POLIZAS as P
ON M.CODMAQUINA = P.CODMAQUINA
WHERE
M.CODEMP = '20'

Todas las maquinas, independientemente de que tengan poliza o no.

SELECT
P.CODEMP AS CODEMP_POLIZA,
M.CODEMP AS CODEMP_MAQUINA,
M.*
FROM
MAQUINAS as M
LEFT JOIN
POLIZAS as P
ON M.CODMAQUINA = P.CODMAQUINA


AMB

"David Perona" wrote:

Hola a todos,
A ver si alguien me puede aclarar una duda que tengo.

Tengo una tabla de máquinas y otra de pólizas que pueden tener estas
máquinas. La primera, tiene como clave primaria los campos codemp y
codmaquina. La segunda, codemp, codmaquina y codcompañia.

Pues bien, necesito una consulta para obtener todas las máquinas,
independientemente de si tienen polizas asociadas o no. En la base de datos,
tengo un único registro en la tabla máquinas, y ninguno en la tabla pólizas.

Hasta hoy, tenia esta consulta:

SELECT P.CODEMP AS CODEMP_POLIZA, M.CODEMP AS CODEMP_MAQUINA, M.* FROM
MAQUINAS M
LEFT JOIN POLIZAS P ON M.CODMAQUINA = P.CODMAQUINA
WHERE M.CODEMP = '20'
AND (P.CODEMP = '20' OR P.CODEMP IS NULL)

Pues resulta que esta consulta no me muestra el registro de la tabla
máquina. Si en cambio, añado en la clausula ON la unión de los campos CODEMP
de ambas tablas, y quito el último AND de la clausula WHERE, la consulta se
comporta como es de esperar. Devuelve todos los datos de la tabla máquinas, y
con valor NULL, los campos correspondientes a la tabla Pólizas.
Entiendo que la sintaxis correcta para esta consulta es como os acabo de
contar, especificando en la clausula ON todos los campos que conforme la
clave principal en la tabla de la izquierda. Pero por otros motivos,
necesitamos montar la consulta de esta manera.

Pues bueno, despues de todo el tostón, alguien podría decirme porque se
comporta asi? No debería ser lo mismo igualar los campos clave en el apartado
ON, que filtrar luego los valores posibles de los campos en el apartado WHERE?

Muchas Gracias a TODOS, por haber leido hasta aqui ;)

Preguntas similares