Tú sí, tú no, tú tampoco, tú sí, tu no, ...

15/01/2008 - 17:26 por David | Informe spam
SQL Server 2000

Muy buenas, en el siguiente escenario:

(1)

TablaPromociones
-
ID_promocion (clave principal)
(muchos más campos)

(2)

TablaArticulos

ID_articulo (clave principal)
(muchos más campos)

(3)

Existe una relación muchos a muchos entre esas dos tablas: una promoción
tiene muchos articulos y un artículo puede estar en muchas promociones, creo
una tabla para definir esta relación muchos a muchos:

TablaRelacionPromocionesArticulos
-
ID_promocion
ID_articulo

La combinación de los dos campos forman la clave principal.

Bien básicamente este es el escenario (lo he simplificado bastante). No se
me ocurre "montar" la siguiente consulta de selección:

Dada una promoción (WHERE ID_promocion=@promocion)
Muestra TODOS, insisto todos los articulos y por ejemplo con un campo BIT
indica aquellos que forman parte de la promoción indicada y los que no
forman.


Imaginemos que tengo 30 articulos (a1, a2, a3, ..., ai, , a30)
La promocion P7 la componen los articulos a2, a13 y a20)

La consulta para la promoción P7 devolvería:

a1 0
a2 1
a3 0
a4 0
a5 0
... 0
a13 1
a14 0
... 0
a20 1
a21 0
... 0
a30 0

¿Es posible escribir esta consulta sin montar "bucles"?

Gracias de antemano

Preguntas similare

Leer las respuestas

#6 David
16/01/2008 - 11:04 | Informe spam
Uh!!!!, voy a probarla ahora mismo.

Insisto, gracias por la ayuda y sobre todo por vuestro interés.

"Jesús López" escribió en el
mensaje news:
Se me ocure otra más simple, sólo con un JOIN

DECLARE @ID_Promocion int
SET @ID_Promocion = 1

SELECT
A.*
CASE WHEN PA.ID_Articulo IS NULL THEN 0 ELSE 1 END AS FormaParte
FROM
Articulos A
LEFT JOIN PromocionesArticulos PA
ON A.ID_Articulo = PA.ID_Articulo AND PA.ID_Promocion = @ID_Promocion


"Alejandro Mesa" escribió en el
mensaje news:
David,

Trata:

CREATE TABLE dbo.TablaPromociones (
ID_promocion INT NOT NULL PRIMARY KEY
)
GO

CREATE TABLE dbo.TablaArticulos (
ID_articulo INT NOT NULL PRIMARY KEY
)
GO

CREATE TABLE dbo.TablaRelacionPromocionesArticulos (
ID_articulo INT NOT NULL,
ID_promocion INT NOT NULL,
CONSTRAINT PK_TablaRelacionPromocionesArticulos PRIMARY KEY (ID_articulo,
ID_promocion),
CONSTRAINT FK_TablaRelacionPromocionesArticulos_TablaPromociones FOREIGN
KEY
(ID_promocion) REFERENCES dbo.TablaPromociones(ID_promocion),
CONSTRAINT FK_TablaRelacionPromocionesArticulos_TablaArticulos FOREIGN
KEY
(ID_articulo) REFERENCES dbo.TablaArticulos(ID_articulo)
)
GO

INSERT INTO TablaArticulos VALUES(1)
INSERT INTO TablaArticulos VALUES(2)
INSERT INTO TablaArticulos VALUES(3)
INSERT INTO TablaArticulos VALUES(4)
INSERT INTO TablaArticulos VALUES(5)

INSERT INTO TablaPromociones VALUES(1)
INSERT INTO TablaPromociones VALUES(2)

INSERT INTO TablaRelacionPromocionesArticulos VALUES(1, 1)
INSERT INTO TablaRelacionPromocionesArticulos VALUES(5, 1)
GO

DECLARE @ID_promocion INT

SET @ID_promocion = 1

select
p.ID_promocion,
a.ID_articulo,
case when pa.ID_articulo is null then 0 else 1 end as forma_parte
from
dbo.TablaPromociones as p
inner join
dbo.TablaRelacionPromocionesArticulos as pa
on p.ID_promocion = pa.ID_promocion
and p.ID_promocion = @ID_promocion
right outer join
dbo.TablaArticulos as a
on a.ID_articulo = pa.ID_articulo
GO

dbo.TablaPromociones
GO


AMB

"David" wrote:

Gracias por responder,

llego hasta aquí, intento que muestre TODOS los articulos y que "marque"
aquellos que forman parte de la promoción, pero, sólo consigo que
devuelva
ÚNICAMENTE los articulos que forman parte de la promoción (se encuentrar
en
la tabla N:M)


SELECT
ID_articulo, ID_promocion

FROM
TablaArticulos LETF OUTER JOIN TablaRelacionPromocionesArticulos

ON
TablaArticulos.ID_articulo=
TablaRelacionPromocionesArticulos.ID_articulo

WHERE (TablaRelacionPromocionesArticulos.ID_promocion = @promocion)


¿Alguna "ayudita"? :-)











Respuesta Responder a este mensaje
#7 Alejandro Mesa
17/01/2008 - 02:48 | Informe spam
Jesús López,

Se me ocure otra más simple, sólo con un JOIN



Solamente asegurate de que existe una restriccion de clave foranea desde
PromocionesArticulos hacia Promociones, que esta este habilitada y ademas sea
confiable, de lo contrario puedes estar trayendo Promociones que no existen
en la tabla padre.


AMB

"Jesús López" wrote:

Se me ocure otra más simple, sólo con un JOIN

DECLARE @ID_Promocion int
SET @ID_Promocion = 1

SELECT
A.*
CASE WHEN PA.ID_Articulo IS NULL THEN 0 ELSE 1 END AS FormaParte
FROM
Articulos A
LEFT JOIN PromocionesArticulos PA
ON A.ID_Articulo = PA.ID_Articulo AND PA.ID_Promocion = @ID_Promocion


"Alejandro Mesa" escribió en el
mensaje news:
> David,
>
> Trata:
>
> CREATE TABLE dbo.TablaPromociones (
> ID_promocion INT NOT NULL PRIMARY KEY
> )
> GO
>
> CREATE TABLE dbo.TablaArticulos (
> ID_articulo INT NOT NULL PRIMARY KEY
> )
> GO
>
> CREATE TABLE dbo.TablaRelacionPromocionesArticulos (
> ID_articulo INT NOT NULL,
> ID_promocion INT NOT NULL,
> CONSTRAINT PK_TablaRelacionPromocionesArticulos PRIMARY KEY (ID_articulo,
> ID_promocion),
> CONSTRAINT FK_TablaRelacionPromocionesArticulos_TablaPromociones FOREIGN
> KEY
> (ID_promocion) REFERENCES dbo.TablaPromociones(ID_promocion),
> CONSTRAINT FK_TablaRelacionPromocionesArticulos_TablaArticulos FOREIGN KEY
> (ID_articulo) REFERENCES dbo.TablaArticulos(ID_articulo)
> )
> GO
>
> INSERT INTO TablaArticulos VALUES(1)
> INSERT INTO TablaArticulos VALUES(2)
> INSERT INTO TablaArticulos VALUES(3)
> INSERT INTO TablaArticulos VALUES(4)
> INSERT INTO TablaArticulos VALUES(5)
>
> INSERT INTO TablaPromociones VALUES(1)
> INSERT INTO TablaPromociones VALUES(2)
>
> INSERT INTO TablaRelacionPromocionesArticulos VALUES(1, 1)
> INSERT INTO TablaRelacionPromocionesArticulos VALUES(5, 1)
> GO
>
> DECLARE @ID_promocion INT
>
> SET @ID_promocion = 1
>
> select
> p.ID_promocion,
> a.ID_articulo,
> case when pa.ID_articulo is null then 0 else 1 end as forma_parte
> from
> dbo.TablaPromociones as p
> inner join
> dbo.TablaRelacionPromocionesArticulos as pa
> on p.ID_promocion = pa.ID_promocion
> and p.ID_promocion = @ID_promocion
> right outer join
> dbo.TablaArticulos as a
> on a.ID_articulo = pa.ID_articulo
> GO
>
> dbo.TablaPromociones
> GO
>
>
> AMB
>
> "David" wrote:
>
>> Gracias por responder,
>>
>> llego hasta aquí, intento que muestre TODOS los articulos y que "marque"
>> aquellos que forman parte de la promoción, pero, sólo consigo que
>> devuelva
>> ÚNICAMENTE los articulos que forman parte de la promoción (se encuentrar
>> en
>> la tabla N:M)
>>
>>
>> SELECT
>> ID_articulo, ID_promocion
>>
>> FROM
>> TablaArticulos LETF OUTER JOIN TablaRelacionPromocionesArticulos
>>
>> ON
>> TablaArticulos.ID_articulo= TablaRelacionPromocionesArticulos.ID_articulo
>>
>> WHERE (TablaRelacionPromocionesArticulos.ID_promocion = @promocion)
>>
>>
>> ¿Alguna "ayudita"? :-)
>>
>>
>>
>>



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