Left Join (2008-05-30)

30/05/2008 - 11:01 por Mauricio | Informe spam
Hola a todos,
tengo problemas con un Left join, no sé si no entiendo el concepto o
qué estoy haciendo mal. Primero, las tablas:
CREATE TABLE [dbo].[MCS_PriceGroups](
[PGR_ID] [int] IDENTITY(1,1) NOT NULL,
[PGR_CODE] [int] NOT NULL,
[PGR_DESCRIPTION] [varchar](30) NOT NULL,
CONSTRAINT [PK_PriceGroups] PRIMARY KEY CLUSTERED

CREATE TABLE [dbo].[MCS_Prices](
[PRI_ID] [int] IDENTITY(1,1) NOT NULL,
[PRI_PRD_ID] [int] NOT NULL,
[PRI_PGR_ID] [int] NOT NULL,
[PRI_SIZE1] [decimal](12, 2) NULL,
[PRI_SIZE2] [decimal](12, 2) NULL,
[PRI_SIZE3] [decimal](12, 2) NULL,
[PRI_SIZE4] [decimal](12, 2) NULL,
[PRI_SIZE5] [decimal](12, 2) NULL,
[PRI_SIZE6] [decimal](12, 2) NULL,
[PRI_SIZE7] [decimal](12, 2) NULL,
[PRI_SIZE8] [decimal](12, 2) NULL,
[PRI_SIZE9] [decimal](12, 2) NULL,
CONSTRAINT [PK__MCS_Prices] PRIMARY KEY CLUSTERED

Un simple query de la primer tabla arroja:
6 1 Hjemmeboende
7 2 Sykehjem
8 3 Ikke komm inst
9 4 Andre komm inst
10 5 Catering
11 6 Another group

(los primeros están en danés).

En la tabla MCS_Prices tengo precios para solo los primeros 5 grupos y
lo que quiero es listar los 6 grupos, aún cuando no haya definido
ningún precio para alguno de ellos.

Pensé que un LEFT OUTER JOIN estaba bien, entonces hice:
SELECT PRI_PRD_ID, PGR_ID, PGR_DESCRIPTION,
PRI_SIZE1, PRI_SIZE2, PRI_SIZE3, PRI_SIZE4, PRI_SIZE5,
PRI_SIZE6, PRI_SIZE7, PRI_SIZE8, PRI_SIZE9
FROM MCS_PriceGroups
LEFT JOIN MCS_Prices ON PRI_PGR_ID = PGR_ID
WHERE PRI_PRD_ID = 3143 OR PRI_PRD_ID IS NULL

Pero siempre obtengo 5 filas.
En el query hay una condición extra, PRI_PRD_ID = 3143, que también
necesito.

Probé con INNER, FULL, RIGHT (dando vueltas las tablas), pero no hay
caso, así que cualquier ayuda es bienvenida.

Muchas gracias y perdón por lo largo del post.

Mauricio
Copenhague, Dinamarca

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
30/05/2008 - 18:17 | Informe spam
Mauricio,

La salida al usar ese operador, depende de las condiciones de filtro usadas
en la clausula FROM, pero tu tambien estas agregando filtros en la clausula
WHERE, asi que lo que sale de el JOIN, luego lo filtras con WHERE y por eso
no ves los resultados esperados. Mueve la espresiones en WHERE hacia el
predicado en JOIN.

SELECT
b.PRI_PRD_ID, a.PGR_ID, a.PGR_DESCRIPTION,
b.PRI_SIZE1, b.PRI_SIZE2, b.PRI_SIZE3, b.PRI_SIZE4, b.PRI_SIZE5,
b.PRI_SIZE6, b.PRI_SIZE7, b.PRI_SIZE8, b.PRI_SIZE9
FROM
MCS_PriceGroups as a
LEFT JOIN
MCS_Prices as b
ON b.PRI_PGR_ID = a.PGR_ID
and (b.PRI_PRD_ID = 3143 OR b.PRI_PRD_ID IS NULL)


AMB

"Mauricio" wrote:

Hola a todos,
tengo problemas con un Left join, no sé si no entiendo el concepto o
qué estoy haciendo mal. Primero, las tablas:
CREATE TABLE [dbo].[MCS_PriceGroups](
[PGR_ID] [int] IDENTITY(1,1) NOT NULL,
[PGR_CODE] [int] NOT NULL,
[PGR_DESCRIPTION] [varchar](30) NOT NULL,
CONSTRAINT [PK_PriceGroups] PRIMARY KEY CLUSTERED

CREATE TABLE [dbo].[MCS_Prices](
[PRI_ID] [int] IDENTITY(1,1) NOT NULL,
[PRI_PRD_ID] [int] NOT NULL,
[PRI_PGR_ID] [int] NOT NULL,
[PRI_SIZE1] [decimal](12, 2) NULL,
[PRI_SIZE2] [decimal](12, 2) NULL,
[PRI_SIZE3] [decimal](12, 2) NULL,
[PRI_SIZE4] [decimal](12, 2) NULL,
[PRI_SIZE5] [decimal](12, 2) NULL,
[PRI_SIZE6] [decimal](12, 2) NULL,
[PRI_SIZE7] [decimal](12, 2) NULL,
[PRI_SIZE8] [decimal](12, 2) NULL,
[PRI_SIZE9] [decimal](12, 2) NULL,
CONSTRAINT [PK__MCS_Prices] PRIMARY KEY CLUSTERED

Un simple query de la primer tabla arroja:
6 1 Hjemmeboende
7 2 Sykehjem
8 3 Ikke komm inst
9 4 Andre komm inst
10 5 Catering
11 6 Another group

(los primeros están en danés).

En la tabla MCS_Prices tengo precios para solo los primeros 5 grupos y
lo que quiero es listar los 6 grupos, aún cuando no haya definido
ningún precio para alguno de ellos.

Pensé que un LEFT OUTER JOIN estaba bien, entonces hice:
SELECT PRI_PRD_ID, PGR_ID, PGR_DESCRIPTION,
PRI_SIZE1, PRI_SIZE2, PRI_SIZE3, PRI_SIZE4, PRI_SIZE5,
PRI_SIZE6, PRI_SIZE7, PRI_SIZE8, PRI_SIZE9
FROM MCS_PriceGroups
LEFT JOIN MCS_Prices ON PRI_PGR_ID = PGR_ID
WHERE PRI_PRD_ID = 3143 OR PRI_PRD_ID IS NULL

Pero siempre obtengo 5 filas.
En el query hay una condición extra, PRI_PRD_ID = 3143, que también
necesito.

Probé con INNER, FULL, RIGHT (dando vueltas las tablas), pero no hay
caso, así que cualquier ayuda es bienvenida.

Muchas gracias y perdón por lo largo del post.

Mauricio
Copenhague, Dinamarca



Respuesta Responder a este mensaje
#2 Penta
30/05/2008 - 18:25 | Informe spam
Hola Mauricio.
Si deseas obtener todos los registros de la izquiera el left Join es
el indicado.
Por otra parte no deberías filtrar en el Where ya que si NO existen
registro del 3143 en MCS_Prices claro que no te traera nada.

Prueba:

SELECT PRI_PRD_ID, PGR_ID, PGR_DESCRIPTION,
PRI_SIZE1, PRI_SIZE2, PRI_SIZE3, PRI_SIZE4, PRI_SIZE5,
PRI_SIZE6, PRI_SIZE7, PRI_SIZE8, PRI_SIZE9
FROM MCS_PriceGroups
LEFT JOIN MCS_Prices ON PRI_PGR_ID = PGR_ID

Y dinos donde existe el 3143
Ya que con el left el 3143 debe existir en MCS_PriceGroups
Ahora si puedes enviarlos los insert de ambas tablas mejor aún.

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