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

#1 Gux (MVP)
15/01/2008 - 17:40 | Informe spam
Sí, es posible usando joins y subconsultas, entre otras posibles maneras de
hacerlo.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"David" wrote:

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




Respuesta Responder a este mensaje
#2 David
15/01/2008 - 18:23 | Informe spam
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
#3 Alejandro Mesa
15/01/2008 - 19:20 | Informe spam
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
#4 David
15/01/2008 - 21:12 | Informe spam
Ahora mismo lo pruebo, gracias

Nota: "me cachis en diez", el camino a recorrer es largo, "esto" del SQL es
realmente COMPLEJO

"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
#5 Jesús López
16/01/2008 - 09:51 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida