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 ;)

Preguntas similare

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 ;)
Respuesta Responder a este mensaje
#2 Alejandro Mesa
20/06/2005 - 16:26 | Informe spam
Correccion,


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



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


AMB

"Alejandro Mesa" wrote:

> 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 ;)
Respuesta Responder a este mensaje
#3 David Perona
20/06/2005 - 19:20 | Informe spam
Hola Alejandro,
La pregunta no era cual es la forma correcta de hacer un left join. De
hecho, al final de la exposición ya digo yo que esta es la correcta.
Mi pregunta es:
¿Porque tengo que poner en el ON todos los campos clave de la tabla de la
izquierda?
¿No bastaría con igualar el código de máquina, y el resto de campos de la
clave primaria, filtrarlos en el apartado WHERE?
La lógica me dice que esto sí es lo mismo, pero no actuan igual. Y lo que
quiero es que me alguien me diga, pues esto es asi por esto y por lo otro.

Muchas gracias de todas formas, Alejandro. A ver si a alguien más se le
ocurre algo.
Un Saludo.
Respuesta Responder a este mensaje
#4 Alejandro Mesa
20/06/2005 - 20:32 | Informe spam
David,

Puedes postear la definicion de las tablas, incluyendo relaciones, asi como
ejemplo de data para poder simular lo que esta pasando en tu server?

Puedes identificar las filas que infringen la logica?


AMB

"David Perona" wrote:


Hola Alejandro,
La pregunta no era cual es la forma correcta de hacer un left join. De
hecho, al final de la exposición ya digo yo que esta es la correcta.
Mi pregunta es:
¿Porque tengo que poner en el ON todos los campos clave de la tabla de la
izquierda?
¿No bastaría con igualar el código de máquina, y el resto de campos de la
clave primaria, filtrarlos en el apartado WHERE?
La lógica me dice que esto sí es lo mismo, pero no actuan igual. Y lo que
quiero es que me alguien me diga, pues esto es asi por esto y por lo otro.

Muchas gracias de todas formas, Alejandro. A ver si a alguien más se le
ocurre algo.
Un Saludo.


Respuesta Responder a este mensaje
#5 Alejandro Mesa
20/06/2005 - 21:35 | Informe spam
David,

Puedes ejecutar esta consulta y decirnos si selecciona alguna fila?

select
*
from
polizas as p
where
codemp is null
and exists(
select
*
from
maquinas as m
where
m.CODEMP = '20'
and m.CODMAQUINA = p.CODMAQUINA
)
go


AMB

"Alejandro Mesa" wrote:

David,

Puedes postear la definicion de las tablas, incluyendo relaciones, asi como
ejemplo de data para poder simular lo que esta pasando en tu server?

Puedes identificar las filas que infringen la logica?


AMB

"David Perona" wrote:

>
> Hola Alejandro,
> La pregunta no era cual es la forma correcta de hacer un left join. De
> hecho, al final de la exposición ya digo yo que esta es la correcta.
> Mi pregunta es:
> ¿Porque tengo que poner en el ON todos los campos clave de la tabla de la
> izquierda?
> ¿No bastaría con igualar el código de máquina, y el resto de campos de la
> clave primaria, filtrarlos en el apartado WHERE?
> La lógica me dice que esto sí es lo mismo, pero no actuan igual. Y lo que
> quiero es que me alguien me diga, pues esto es asi por esto y por lo otro.
>
> Muchas gracias de todas formas, Alejandro. A ver si a alguien más se le
> ocurre algo.
> Un Saludo.
>
>
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida