Select dificil parami.

05/02/2004 - 22:42 por Jose Antonio | Informe spam
Hola a todos, me estoy liando con las consultas de sql y cada dia me surgen
problemas que no puedo resolver.
Ayer me resolvisteis uno y hoy tengo otro.

Tengo tres tablas, en la primera estan los clientes, en la segunda los
pedidos de estos clientes y en la tercera las lineas de estos pedidos.

Necesito saber con un select, los clientes cuyos pedidos incluyan lineas con
unos productos determinados y puedan exluirse dependiendo de si tienen otro
producto o no.

Ejemplo:

Clientes Pedidos Lineas de Pedidos
1 1 P1
P2
P3
P4
P5

2 2 P1
P3
P5

3 3 P1
P2
P3
P5

En este caso. ¿Que clientes tienen en sus pedidos los productos P1 y P3 pero
excluyendo a los que ademas tien el P2.

El resultado seria El cliente 2, ya que aunque el 1 y el 3 cumplen la
condicion deben ser excluidos porque tambien tienen el P2.

Haber si me podeis ayudar.


Saludos y Gracias.

Preguntas similare

Leer las respuestas

#1 Manuel
06/02/2004 - 09:31 | Informe spam
Hola,
he recreado tu situación... espero que te sirva...


CREATE TABLE cliente (idcliente int)
CREATE TABLE pedido (idpedido int ,codigocliente int)
CREATE TABLE [linea_p] (producto varchar(10),codigopedido int)

INSERT INTO cliente VALUES (1)
INSERT INTO cliente VALUES (2)
INSERT INTO cliente VALUES (3)

INSERT INTO pedido VALUES (1, 1)
INSERT INTO pedido VALUES (2, 2)
INSERT INTO pedido VALUES (3, 3)

INSERT INTO linea_p VALUES ('p1', 1)
INSERT INTO linea_p VALUES ('p2', 1)
INSERT INTO linea_p VALUES ('p3', 1)
INSERT INTO linea_p VALUES ('p4', 1)
INSERT INTO linea_p VALUES ('p5', 1)
INSERT INTO linea_p VALUES ('p1', 2)
INSERT INTO linea_p VALUES ('p3', 2)
INSERT INTO linea_p VALUES ('p5', 2)
INSERT INTO linea_p VALUES ('p1', 3)
INSERT INTO linea_p VALUES ('p2', 3)
INSERT INTO linea_p VALUES ('p3', 3)
INSERT INTO linea_p VALUES ('p5', 3)

select distinct idcliente
from cliente, pedido, linea_p
where idcliente = codigocliente
and idpedido = codigopedido
and producto in ('p1','p3')
and idcliente not in
(select distinct idcliente
from cliente, pedido, linea_p
where idcliente = codigocliente
and idpedido = codigopedido
and producto in ('p2')
)


Saludos.


"Jose Antonio" escribió en el mensaje
news:
Hola a todos, me estoy liando con las consultas de sql y cada dia me


surgen
problemas que no puedo resolver.
Ayer me resolvisteis uno y hoy tengo otro.

Tengo tres tablas, en la primera estan los clientes, en la segunda los
pedidos de estos clientes y en la tercera las lineas de estos pedidos.

Necesito saber con un select, los clientes cuyos pedidos incluyan lineas


con
unos productos determinados y puedan exluirse dependiendo de si tienen


otro
producto o no.

Ejemplo:

Clientes Pedidos Lineas de Pedidos
1 1 P1
P2
P3
P4
P5

2 2 P1
P3
P5

3 3 P1
P2
P3
P5

En este caso. ¿Que clientes tienen en sus pedidos los productos P1 y P3


pero
excluyendo a los que ademas tien el P2.

El resultado seria El cliente 2, ya que aunque el 1 y el 3 cumplen la
condicion deben ser excluidos porque tambien tienen el P2.

Haber si me podeis ayudar.


Saludos y Gracias.



Respuesta Responder a este mensaje
#2 Jose Mariano Alvarez \(MUG\)
06/02/2004 - 16:11 | Informe spam
Este query no funciona ya que el IN no tiene el group by correspondiente
para saber que exactamente tiene los dos productos.

Agrega estos registro y vas a ver que tambien te lista el cliente 4 aunque
no tiene producto p2

INSERT INTO cliente VALUES (4)
INSERT INTO pedido VALUES (4, 4)
INSERT INTO linea_p VALUES ('p1', 4)


Aqui tienes un ejemplo que funciona


select distinct
cl.idcliente
from
cliente cl
inner join pedido pe ON cl.IDCliente = pe.CodigoCliente
inner join
(
Select
A.codigopedido
from
linea_p A
where
A.producto in ('p1','p3') -- aca van los productos seleccionados
and not exists(
Select
B.codigopedido
from
linea_p B
where A.codigopedido=B.codigopedido
and B.producto in ('p2') -- aca van los productos excluidos
)
group by
A.codigopedido
having count (*) = 2 -- Aca va la cantidad de productos selecionados
) linea_pDerivada
ON pe.IDPedido = linea_pDerivada.codigopedido



Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar

"Manuel" wrote in message
news:
Hola,
he recreado tu situación... espero que te sirva...


CREATE TABLE cliente (idcliente int)
CREATE TABLE pedido (idpedido int ,codigocliente int)
CREATE TABLE [linea_p] (producto varchar(10),codigopedido int)

INSERT INTO cliente VALUES (1)
INSERT INTO cliente VALUES (2)
INSERT INTO cliente VALUES (3)

INSERT INTO pedido VALUES (1, 1)
INSERT INTO pedido VALUES (2, 2)
INSERT INTO pedido VALUES (3, 3)

INSERT INTO linea_p VALUES ('p1', 1)
INSERT INTO linea_p VALUES ('p2', 1)
INSERT INTO linea_p VALUES ('p3', 1)
INSERT INTO linea_p VALUES ('p4', 1)
INSERT INTO linea_p VALUES ('p5', 1)
INSERT INTO linea_p VALUES ('p1', 2)
INSERT INTO linea_p VALUES ('p3', 2)
INSERT INTO linea_p VALUES ('p5', 2)
INSERT INTO linea_p VALUES ('p1', 3)
INSERT INTO linea_p VALUES ('p2', 3)
INSERT INTO linea_p VALUES ('p3', 3)
INSERT INTO linea_p VALUES ('p5', 3)

select distinct idcliente
from cliente, pedido, linea_p
where idcliente = codigocliente
and idpedido = codigopedido
and producto in ('p1','p3')
and idcliente not in
(select distinct idcliente
from cliente, pedido, linea_p
where idcliente = codigocliente
and idpedido = codigopedido
and producto in ('p2')
)


Saludos.


"Jose Antonio" escribió en el mensaje
news:
> Hola a todos, me estoy liando con las consultas de sql y cada dia me
surgen
> problemas que no puedo resolver.
> Ayer me resolvisteis uno y hoy tengo otro.
>
> Tengo tres tablas, en la primera estan los clientes, en la segunda los
> pedidos de estos clientes y en la tercera las lineas de estos pedidos.
>
> Necesito saber con un select, los clientes cuyos pedidos incluyan lineas
con
> unos productos determinados y puedan exluirse dependiendo de si tienen
otro
> producto o no.
>
> Ejemplo:
>
> Clientes Pedidos Lineas de Pedidos
> 1 1 P1
> P2
> P3
> P4
> P5
>
> 2 2 P1
> P3
> P5
>
> 3 3 P1
> P2
> P3
> P5
>
> En este caso. ¿Que clientes tienen en sus pedidos los productos P1 y P3
pero
> excluyendo a los que ademas tien el P2.
>
> El resultado seria El cliente 2, ya que aunque el 1 y el 3 cumplen la
> condicion deben ser excluidos porque tambien tienen el P2.
>
> Haber si me podeis ayudar.
>
>
> Saludos y Gracias.
>
>
>


Respuesta Responder a este mensaje
#3 Jose Antonio
06/02/2004 - 17:00 | Informe spam
Gracias por las ideas, lo que pasa es que los valores que se incluyen deben
estar todos , no alguno de ellos.

Mas ideas?


"Manuel" escribió en el mensaje
news:
Hola,
he recreado tu situación... espero que te sirva...


CREATE TABLE cliente (idcliente int)
CREATE TABLE pedido (idpedido int ,codigocliente int)
CREATE TABLE [linea_p] (producto varchar(10),codigopedido int)

INSERT INTO cliente VALUES (1)
INSERT INTO cliente VALUES (2)
INSERT INTO cliente VALUES (3)

INSERT INTO pedido VALUES (1, 1)
INSERT INTO pedido VALUES (2, 2)
INSERT INTO pedido VALUES (3, 3)

INSERT INTO linea_p VALUES ('p1', 1)
INSERT INTO linea_p VALUES ('p2', 1)
INSERT INTO linea_p VALUES ('p3', 1)
INSERT INTO linea_p VALUES ('p4', 1)
INSERT INTO linea_p VALUES ('p5', 1)
INSERT INTO linea_p VALUES ('p1', 2)
INSERT INTO linea_p VALUES ('p3', 2)
INSERT INTO linea_p VALUES ('p5', 2)
INSERT INTO linea_p VALUES ('p1', 3)
INSERT INTO linea_p VALUES ('p2', 3)
INSERT INTO linea_p VALUES ('p3', 3)
INSERT INTO linea_p VALUES ('p5', 3)

select distinct idcliente
from cliente, pedido, linea_p
where idcliente = codigocliente
and idpedido = codigopedido
and producto in ('p1','p3')
and idcliente not in
(select distinct idcliente
from cliente, pedido, linea_p
where idcliente = codigocliente
and idpedido = codigopedido
and producto in ('p2')
)


Saludos.


"Jose Antonio" escribió en el mensaje
news:
> Hola a todos, me estoy liando con las consultas de sql y cada dia me
surgen
> problemas que no puedo resolver.
> Ayer me resolvisteis uno y hoy tengo otro.
>
> Tengo tres tablas, en la primera estan los clientes, en la segunda los
> pedidos de estos clientes y en la tercera las lineas de estos pedidos.
>
> Necesito saber con un select, los clientes cuyos pedidos incluyan lineas
con
> unos productos determinados y puedan exluirse dependiendo de si tienen
otro
> producto o no.
>
> Ejemplo:
>
> Clientes Pedidos Lineas de Pedidos
> 1 1 P1
> P2
> P3
> P4
> P5
>
> 2 2 P1
> P3
> P5
>
> 3 3 P1
> P2
> P3
> P5
>
> En este caso. ¿Que clientes tienen en sus pedidos los productos P1 y P3
pero
> excluyendo a los que ademas tien el P2.
>
> El resultado seria El cliente 2, ya que aunque el 1 y el 3 cumplen la
> condicion deben ser excluidos porque tambien tienen el P2.
>
> Haber si me podeis ayudar.
>
>
> Saludos y Gracias.
>
>
>


Respuesta Responder a este mensaje
#4 Jose Antonio
06/02/2004 - 18:28 | Informe spam
He llegado tarde en la respuesta anterior a tu correo, tu versión funciona
perfectamente.

Gracias.

"Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* * mug.org.ar> escribió
en el mensaje news:OF$j$
Este query no funciona ya que el IN no tiene el group by correspondiente
para saber que exactamente tiene los dos productos.

Agrega estos registro y vas a ver que tambien te lista el cliente 4 aunque
no tiene producto p2

INSERT INTO cliente VALUES (4)
INSERT INTO pedido VALUES (4, 4)
INSERT INTO linea_p VALUES ('p1', 4)


Aqui tienes un ejemplo que funciona


select distinct
cl.idcliente
from
cliente cl
inner join pedido pe ON cl.IDCliente = pe.CodigoCliente
inner join
(
Select
A.codigopedido
from
linea_p A
where
A.producto in ('p1','p3') -- aca van los productos seleccionados
and not exists(
Select
B.codigopedido
from
linea_p B
where A.codigopedido=B.codigopedido
and B.producto in ('p2') -- aca van los productos excluidos
)
group by
A.codigopedido
having count (*) = 2 -- Aca va la cantidad de productos


selecionados
) linea_pDerivada
ON pe.IDPedido = linea_pDerivada.codigopedido



Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar

"Manuel" wrote in message
news:
> Hola,
> he recreado tu situación... espero que te sirva...
>
>
> CREATE TABLE cliente (idcliente int)
> CREATE TABLE pedido (idpedido int ,codigocliente int)
> CREATE TABLE [linea_p] (producto varchar(10),codigopedido int)
>
> INSERT INTO cliente VALUES (1)
> INSERT INTO cliente VALUES (2)
> INSERT INTO cliente VALUES (3)
>
> INSERT INTO pedido VALUES (1, 1)
> INSERT INTO pedido VALUES (2, 2)
> INSERT INTO pedido VALUES (3, 3)
>
> INSERT INTO linea_p VALUES ('p1', 1)
> INSERT INTO linea_p VALUES ('p2', 1)
> INSERT INTO linea_p VALUES ('p3', 1)
> INSERT INTO linea_p VALUES ('p4', 1)
> INSERT INTO linea_p VALUES ('p5', 1)
> INSERT INTO linea_p VALUES ('p1', 2)
> INSERT INTO linea_p VALUES ('p3', 2)
> INSERT INTO linea_p VALUES ('p5', 2)
> INSERT INTO linea_p VALUES ('p1', 3)
> INSERT INTO linea_p VALUES ('p2', 3)
> INSERT INTO linea_p VALUES ('p3', 3)
> INSERT INTO linea_p VALUES ('p5', 3)
>
> select distinct idcliente
> from cliente, pedido, linea_p
> where idcliente = codigocliente
> and idpedido = codigopedido
> and producto in ('p1','p3')
> and idcliente not in
> (select distinct idcliente
> from cliente, pedido, linea_p
> where idcliente = codigocliente
> and idpedido = codigopedido
> and producto in ('p2')
> )
>
>
> Saludos.
>
>
> "Jose Antonio" escribió en el mensaje
> news:
> > Hola a todos, me estoy liando con las consultas de sql y cada dia me
> surgen
> > problemas que no puedo resolver.
> > Ayer me resolvisteis uno y hoy tengo otro.
> >
> > Tengo tres tablas, en la primera estan los clientes, en la segunda los
> > pedidos de estos clientes y en la tercera las lineas de estos pedidos.
> >
> > Necesito saber con un select, los clientes cuyos pedidos incluyan


lineas
> con
> > unos productos determinados y puedan exluirse dependiendo de si tienen
> otro
> > producto o no.
> >
> > Ejemplo:
> >
> > Clientes Pedidos Lineas de Pedidos
> > 1 1 P1
> > P2
> > P3
> > P4
> > P5
> >
> > 2 2 P1
> > P3
> > P5
> >
> > 3 3 P1
> > P2
> > P3
> > P5
> >
> > En este caso. ¿Que clientes tienen en sus pedidos los productos P1 y


P3
> pero
> > excluyendo a los que ademas tien el P2.
> >
> > El resultado seria El cliente 2, ya que aunque el 1 y el 3 cumplen


la
> > condicion deben ser excluidos porque tambien tienen el P2.
> >
> > Haber si me podeis ayudar.
> >
> >
> > Saludos y Gracias.
> >
> >
> >
>
>


Respuesta Responder a este mensaje
#5 jchavez
09/02/2004 - 23:20 | Informe spam
Consulto no seria mas eficiente en vez del not in .. un EXISts????
entiendo que ello es un poco mas complejo de comprender porque
inviertes la consulta pero a la vez es mucho mas eficiente.-
Slds.

"Jose Antonio" wrote in message news:...
Gracias por las ideas, lo que pasa es que los valores que se incluyen deben
estar todos , no alguno de ellos.

Mas ideas?


"Manuel" escribió en el mensaje
news:
> Hola,
> he recreado tu situación... espero que te sirva...
>
>
> CREATE TABLE cliente (idcliente int)
> CREATE TABLE pedido (idpedido int ,codigocliente int)
> CREATE TABLE [linea_p] (producto varchar(10),codigopedido int)
>
> INSERT INTO cliente VALUES (1)
> INSERT INTO cliente VALUES (2)
> INSERT INTO cliente VALUES (3)
>
> INSERT INTO pedido VALUES (1, 1)
> INSERT INTO pedido VALUES (2, 2)
> INSERT INTO pedido VALUES (3, 3)
>
> INSERT INTO linea_p VALUES ('p1', 1)
> INSERT INTO linea_p VALUES ('p2', 1)
> INSERT INTO linea_p VALUES ('p3', 1)
> INSERT INTO linea_p VALUES ('p4', 1)
> INSERT INTO linea_p VALUES ('p5', 1)
> INSERT INTO linea_p VALUES ('p1', 2)
> INSERT INTO linea_p VALUES ('p3', 2)
> INSERT INTO linea_p VALUES ('p5', 2)
> INSERT INTO linea_p VALUES ('p1', 3)
> INSERT INTO linea_p VALUES ('p2', 3)
> INSERT INTO linea_p VALUES ('p3', 3)
> INSERT INTO linea_p VALUES ('p5', 3)
>
> select distinct idcliente
> from cliente, pedido, linea_p
> where idcliente = codigocliente
> and idpedido = codigopedido
> and producto in ('p1','p3')
> and idcliente not in
> (select distinct idcliente
> from cliente, pedido, linea_p
> where idcliente = codigocliente
> and idpedido = codigopedido
> and producto in ('p2')
> )
>
>
> Saludos.
>
>
> "Jose Antonio" escribió en el mensaje
> news:
> > Hola a todos, me estoy liando con las consultas de sql y cada dia me
surgen
> > problemas que no puedo resolver.
> > Ayer me resolvisteis uno y hoy tengo otro.
> >
> > Tengo tres tablas, en la primera estan los clientes, en la segunda los
> > pedidos de estos clientes y en la tercera las lineas de estos pedidos.
> >
> > Necesito saber con un select, los clientes cuyos pedidos incluyan lineas
con
> > unos productos determinados y puedan exluirse dependiendo de si tienen
otro
> > producto o no.
> >
> > Ejemplo:
> >
> > Clientes Pedidos Lineas de Pedidos
> > 1 1 P1
> > P2
> > P3
> > P4
> > P5
> >
> > 2 2 P1
> > P3
> > P5
> >
> > 3 3 P1
> > P2
> > P3
> > P5
> >
> > En este caso. ¿Que clientes tienen en sus pedidos los productos P1 y P3
pero
> > excluyendo a los que ademas tien el P2.
> >
> > El resultado seria El cliente 2, ya que aunque el 1 y el 3 cumplen la
> > condicion deben ser excluidos porque tambien tienen el P2.
> >
> > Haber si me podeis ayudar.
> >
> >
> > Saludos y Gracias.
> >
> >
> >
>
>
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida