inner/left/right join (muy basico)

30/06/2005 - 22:57 por Adrian Alvarez | Informe spam
Tengo una duda EXTREMADAMENTE basica, pero son tantos años de programar con
el viejo estilo de joins (uniendo las tablas en el WHERE) que a duras penas
me acostumbre a usar el INNER JOIN cuando si o si hay registros
relacionados.

El problema simplificado es el siguiente.

Una tabla Productos (codigo, descripcion) y una tabla Imagenes (producto,
imagen, esprincipal) en la que productos.codigo = imagenes.producto.

El tema es q no todos los productos tienen imagenes, pero yo los quiero
mostrar de todos modos aunque no las tengan. Eso lo solucionaria con el
LEFT JOIN. Peeero, hay productos q tienen muchas imagenes, y yo solo quiero
mostrar la que esta marcada como "esprincipal"

Probe con el SELECT p.descripcion, i.imagen FROM productos p LEFT JOIN
imagenes i ON (p.codigo = i.producto) WHERE i.esprincipal = 1 y solo me
muestra los productos que si tienen imagen asociada.

Como deberia ser la consulta para obtener TODOS los productos, tengan o no
imagen, y SOLO una linea si tienen muchas imagenes (aquella que esprincipal
= 1)

Desde ya muchas gracias.

Preguntas similare

Leer las respuestas

#1 Camilo Acosta
30/06/2005 - 23:06 | Informe spam
Proba con:

WHERE i.esprincipal = 1 or i.esprincipal IS NULL


"Adrian Alvarez" escribió en el mensaje
news:
Tengo una duda EXTREMADAMENTE basica, pero son tantos años de programar
con
el viejo estilo de joins (uniendo las tablas en el WHERE) que a duras
penas
me acostumbre a usar el INNER JOIN cuando si o si hay registros
relacionados.

El problema simplificado es el siguiente.

Una tabla Productos (codigo, descripcion) y una tabla Imagenes (producto,
imagen, esprincipal) en la que productos.codigo = imagenes.producto.

El tema es q no todos los productos tienen imagenes, pero yo los quiero
mostrar de todos modos aunque no las tengan. Eso lo solucionaria con el
LEFT JOIN. Peeero, hay productos q tienen muchas imagenes, y yo solo
quiero
mostrar la que esta marcada como "esprincipal"

Probe con el SELECT p.descripcion, i.imagen FROM productos p LEFT JOIN
imagenes i ON (p.codigo = i.producto) WHERE i.esprincipal = 1 y solo me
muestra los productos que si tienen imagen asociada.

Como deberia ser la consulta para obtener TODOS los productos, tengan o no
imagen, y SOLO una linea si tienen muchas imagenes (aquella que
esprincipal
= 1)

Desde ya muchas gracias.


Respuesta Responder a este mensaje
#2 Manuel Vera
30/06/2005 - 23:11 | Informe spam
Ok, tu consulta original esta "bien"

¡pero!...

como a la derecha hay o no hay imagenes entonces te falta verificar las que
NO ESTAN, asi

SELECT p.descripcion, i.imagen
FROM productos p LEFT JOIN imagenes i
ON (p.codigo = i.producto)
WHERE i.esprincipal = 1 OR I.ESPRINCIPAL IS NULL

Pues del lado derecho del JOIN cuando no hay registros, se les asigna NULL a
todas las columnas

Salu2
MV


"Adrian Alvarez" wrote in message
news:
Tengo una duda EXTREMADAMENTE basica, pero son tantos años de programar


con
el viejo estilo de joins (uniendo las tablas en el WHERE) que a duras


penas
me acostumbre a usar el INNER JOIN cuando si o si hay registros
relacionados.

El problema simplificado es el siguiente.

Una tabla Productos (codigo, descripcion) y una tabla Imagenes (producto,
imagen, esprincipal) en la que productos.codigo = imagenes.producto.

El tema es q no todos los productos tienen imagenes, pero yo los quiero
mostrar de todos modos aunque no las tengan. Eso lo solucionaria con el
LEFT JOIN. Peeero, hay productos q tienen muchas imagenes, y yo solo


quiero
mostrar la que esta marcada como "esprincipal"

Probe con el SELECT p.descripcion, i.imagen FROM productos p LEFT JOIN
imagenes i ON (p.codigo = i.producto) WHERE i.esprincipal = 1 y solo me
muestra los productos que si tienen imagen asociada.

Como deberia ser la consulta para obtener TODOS los productos, tengan o no
imagen, y SOLO una linea si tienen muchas imagenes (aquella que


esprincipal
= 1)

Desde ya muchas gracias.


Respuesta Responder a este mensaje
#3 Adrian Alvarez
30/06/2005 - 23:40 | Informe spam
exactamente, con eso devolvio tal cual lo esperado.

Muchas gracias Camilo y Manuel, ambos dieron la respuesta.




"Camilo Acosta" escribió en el mensaje
news:%
Proba con:

WHERE i.esprincipal = 1 or i.esprincipal IS NULL


"Adrian Alvarez" escribió en el mensaje
news:
> Tengo una duda EXTREMADAMENTE basica, pero son tantos años de programar
> con
> el viejo estilo de joins (uniendo las tablas en el WHERE) que a duras
> penas
> me acostumbre a usar el INNER JOIN cuando si o si hay registros
> relacionados.
>
> El problema simplificado es el siguiente.
>
> Una tabla Productos (codigo, descripcion) y una tabla Imagenes


(producto,
> imagen, esprincipal) en la que productos.codigo = imagenes.producto.
>
> El tema es q no todos los productos tienen imagenes, pero yo los quiero
> mostrar de todos modos aunque no las tengan. Eso lo solucionaria con el
> LEFT JOIN. Peeero, hay productos q tienen muchas imagenes, y yo solo
> quiero
> mostrar la que esta marcada como "esprincipal"
>
> Probe con el SELECT p.descripcion, i.imagen FROM productos p LEFT JOIN
> imagenes i ON (p.codigo = i.producto) WHERE i.esprincipal = 1 y solo me
> muestra los productos que si tienen imagen asociada.
>
> Como deberia ser la consulta para obtener TODOS los productos, tengan o


no
> imagen, y SOLO una linea si tienen muchas imagenes (aquella que
> esprincipal
> = 1)
>
> Desde ya muchas gracias.
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida