Una facilita sobre consultas...

03/09/2003 - 14:31 por Daniel Rodriguez | Informe spam
Hola a todos!!

Antes de nada, muchas gracias por el interes que demostrais...

Bueno, esta es una facilita sobre la mejor forma de obtener los datos
deseados... os cuento.

Tengo una tabla Envio y otra ReferenciasEnvios

La de Envio simplemente consta de un campo IdMaterial (son enteros para
identificar diferentes objetos)
Por ejemplo,
IdMaterial

10
20
30


La de referencias envios en definitiva es asi:

IdRefEnvio IdMaterial
1 10
1 20
1 30
2 10
2 20
2 30
2 40
2 50
2 60
3 10
3 20


Lo que quiero es saber cual es la forma más rápida para saber si existe
algun IdRefEnvio que contenga el material de la Tabla Envio.

En este caso, obtener el IdRefEnvio 1, que tiene los IdMaterial contenidos
en la tabla Envio, ni más material, ni menos material... el mismo.

Como veis, el envio IdRefEnvio 2 tambien contiene el material 10,20 y 30,
pero como tiene más material (el 40,50 y 60) , no me sirve...
Con el IdRefEnvio3 pasa lo mismo, tiene el material 10 y 20, pero como no
tiene el 30 no lo necesito.

En definitiva, si en la tabla de referencias existe un envio con el mismo
material que hay en Envio, necesito su IdRefEnvio.

La tabla envios puede tener un gran numero de registros, por lo que
necesitaria la forma mas rápida de obtener el IdRefEnvio...

Espero haberme explicado bien

Y seguramente es muy simple, pero la unica forma que veo es realizar varias
comprobaciones para obtenerlo y no se si estará bien hecho
(en cuanto a velocidad... y esas cosas)

Espero sus sugerencias.
Un saludo a todos,

Daniel R.

Preguntas similare

Leer las respuestas

#1 Liliana Sorrentino
03/09/2003 - 15:55 | Informe spam
Hola Daniel,
A ver cómo va esto, aparentemente funciona bien, y además asumo que tenés
índices sobre ambas tablas.
Saludos... Liliana.

SELECT IdRefEnvio
FROM (SELECT IdRefEnvio, RIdMaterial = R.IdMaterial, EIdMaterial E.IdMaterial
FROM #Envio E
FULL JOIN #ReferenciasEnvios R ON E.IdMaterial = R.IdMaterial) Derivada
GROUP BY IdRefEnvio
HAVING COUNT(*) = (SELECT COUNT(*) FROM #Envio)

"Daniel Rodriguez" escribió en el mensaje
news:
Hola a todos!!

Antes de nada, muchas gracias por el interes que demostrais...

Bueno, esta es una facilita sobre la mejor forma de obtener los datos
deseados... os cuento.

Tengo una tabla Envio y otra ReferenciasEnvios

La de Envio simplemente consta de un campo IdMaterial (son enteros para
identificar diferentes objetos)
Por ejemplo,
IdMaterial

10
20
30


La de referencias envios en definitiva es asi:

IdRefEnvio IdMaterial
1 10
1 20
1 30
2 10
2 20
2 30
2 40
2 50
2 60
3 10
3 20


Lo que quiero es saber cual es la forma más rápida para saber si existe
algun IdRefEnvio que contenga el material de la Tabla Envio.

En este caso, obtener el IdRefEnvio 1, que tiene los IdMaterial contenidos
en la tabla Envio, ni más material, ni menos material... el mismo.

Como veis, el envio IdRefEnvio 2 tambien contiene el material 10,20 y 30,
pero como tiene más material (el 40,50 y 60) , no me sirve...
Con el IdRefEnvio3 pasa lo mismo, tiene el material 10 y 20, pero como no
tiene el 30 no lo necesito.

En definitiva, si en la tabla de referencias existe un envio con el mismo
material que hay en Envio, necesito su IdRefEnvio.

La tabla envios puede tener un gran numero de registros, por lo que
necesitaria la forma mas rápida de obtener el IdRefEnvio...

Espero haberme explicado bien

Y seguramente es muy simple, pero la unica forma que veo es realizar


varias
comprobaciones para obtenerlo y no se si estará bien hecho
(en cuanto a velocidad... y esas cosas)

Espero sus sugerencias.
Un saludo a todos,

Daniel R.


Respuesta Responder a este mensaje
#2 Javier Loria
03/09/2003 - 16:20 | Informe spam
Hola Daniel:
Es mejor si nos pasas codigo que podamos pegar en en Query Analizer,
pero si entendi correctamente es mas o menos asi:
/* Codigo de Creacion de Tablas */
/* Asumo Llaves Primarias */
CREATE TABLE Materiales(
IdMaterial INT NOT NULL PRIMARY KEY
)

CREATE TABLE Envios(
IdRefEnvio INT NOT NULL,
IdMaterial INT NOT NULL,
CONSTRAINT PKEnvios PRIMARY KEY(IdRefEnvio,IdMaterial)
)
INSERT Materiales
VALUES (10)
INSERT Materiales
VALUES (20)
INSERT Materiales
VALUES (30)

INSERT Envios
VALUES(1,10)
INSERT Envios
VALUES(1,20)
INSERT Envios
VALUES(1, 30)
INSERT Envios
VALUES(2, 10)
INSERT Envios
VALUES(2, 20)
INSERT Envios
VALUES(2,30)
INSERT Envios
VALUES(2,40)
INSERT Envios
VALUES(2,50)
INSERT Envios
VALUES(2,60)
INSERT Envios
VALUES(3,10)
INSERT Envios
VALUES(3,20)

/* Consulta de Pedido que */
/* tiene los mismos materiales */
SELECT Envios.IdRefEnvio
FROM Envios LEFT JOIN Materiales ON
Envios.IdMaterial=Materiales.IdMaterial
GROUP BY Envios.IdRefEnvio
HAVING (COUNT(*)=(SELECT COUNT(*) FROM Materiales)) AND
(SUM(CASE WHEN Materiales.IdMaterial IS NULL THEN 1 ELSE 0 END)=0)
/* Fin de Codigo */
Agunos comentarios:
a) Nota el Uso del LEFT JOIN para capturas los que que no estan en la
lista de Materiales.
b) El COUNT(*) me dice si la cantidad es la misma o sea si todos estan.
c) El COUNT(CASE ...) me dice que no hay de mas.

Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.


Daniel Rodriguez escribio:
Hola a todos!!

Antes de nada, muchas gracias por el interes que demostrais...

Bueno, esta es una facilita sobre la mejor forma de obtener los datos
deseados... os cuento.

Tengo una tabla Envio y otra ReferenciasEnvios

La de Envio simplemente consta de un campo IdMaterial (son enteros
para identificar diferentes objetos)
Por ejemplo,
IdMaterial

10
20
30


La de referencias envios en definitiva es asi:

IdRefEnvio IdMaterial
1 10
1 20
1 30
2 10
2 20
2 30
2 40
2 50
2 60
3 10
3 20


Lo que quiero es saber cual es la forma más rápida para saber si
existe algun IdRefEnvio que contenga el material de la Tabla Envio.

En este caso, obtener el IdRefEnvio 1, que tiene los IdMaterial
contenidos en la tabla Envio, ni más material, ni menos material...
el mismo.

Como veis, el envio IdRefEnvio 2 tambien contiene el material 10,20 y
30, pero como tiene más material (el 40,50 y 60) , no me sirve...
Con el IdRefEnvio3 pasa lo mismo, tiene el material 10 y 20, pero
como no tiene el 30 no lo necesito.

En definitiva, si en la tabla de referencias existe un envio con el
mismo material que hay en Envio, necesito su IdRefEnvio.

La tabla envios puede tener un gran numero de registros, por lo que
necesitaria la forma mas rápida de obtener el IdRefEnvio...

Espero haberme explicado bien

Y seguramente es muy simple, pero la unica forma que veo es realizar
varias comprobaciones para obtenerlo y no se si estará bien hecho
(en cuanto a velocidad... y esas cosas)

Espero sus sugerencias.
Un saludo a todos,

Daniel R.
Respuesta Responder a este mensaje
#3 Daniel Rodriguez
03/09/2003 - 16:43 | Informe spam
Muchas gracias por tu tiempo Javier y por las molestias que te has tomado.

La proxima vez intentare ahorraros algo de tiempo escribiendo yo el codigo
(en eso te doy toda la razon ;))) )

Muchas gracias de nuevo, a ti y a Liliana.

Salu2!!

Daniel R.
Respuesta Responder a este mensaje
#4 Liliana Sorrentino
03/09/2003 - 17:22 | Informe spam
Lara,

gracias por la corrección, no tuve en cuenta que podía darse ese caso con la
información.
Tu query funciona bien, pero date una vuelta por lo publicado por Javier, su
plan de ejecución es muy eficiente.
Como ves, todos aprendemos en este grupo.

Saludos... Liliana.

"Lara" escribió en el mensaje
news:
Hola,

No soy muy experta, pero llevaba un rato dándole vueltas. Cuando he visto
la consulta de Liliana la he probado, y creo que hay un caso en el que la
consulta no es válida. Prueba a añadir estos tres registros a tu ejemplo:

IdRefEnvio IdMaterial
4 10
4 20
4 50

Si posteriormente pruebas su consulta, el resultado será IdRefEnvio = 1 y


4,
cuando sólo debe ser el IdRefEnvio 1, ya que el IdMaterial 50 no lo tenías
en tu tabla.

Gracias a la consulta de Liliana, y dándoles más vueltas ... he llegado a
esta consulta, y creo que funciona, aunque no te aseguro el buen
rendimiento

SELECT Ref.IdRefEnvio
FROM ReferenciasEnvios Ref
WHERE Ref.IdRefEnvio not in
(SELECT Ref1.IdRefEnvio
FROM ReferenciasEnvios Ref1
WHERE Ref1.idmaterial NOT IN (SELECT E.IdMaterial FROM Envio E))
GROUP BY Ref.IdRefEnvio
HAVING count(*) = (SELECT count(*) FROM Envio)


Saludos y gracias por todas vuestras aportaciones. Estoy aprendiendo
muchísimo!



"Daniel Rodriguez" escribió en el mensaje
news:
> Hola a todos!!
>
> Antes de nada, muchas gracias por el interes que demostrais...
>
> Bueno, esta es una facilita sobre la mejor forma de obtener los datos
> deseados... os cuento.
>
> Tengo una tabla Envio y otra ReferenciasEnvios
>
> La de Envio simplemente consta de un campo IdMaterial (son enteros para
> identificar diferentes objetos)
> Por ejemplo,
> IdMaterial
>
> 10
> 20
> 30
>
>
> La de referencias envios en definitiva es asi:
>
> IdRefEnvio IdMaterial
> 1 10
> 1 20
> 1 30
> 2 10
> 2 20
> 2 30
> 2 40
> 2 50
> 2 60
> 3 10
> 3 20
>
>
> Lo que quiero es saber cual es la forma más rápida para saber si existe
> algun IdRefEnvio que contenga el material de la Tabla Envio.
>
> En este caso, obtener el IdRefEnvio 1, que tiene los IdMaterial


contenidos
> en la tabla Envio, ni más material, ni menos material... el mismo.
>
> Como veis, el envio IdRefEnvio 2 tambien contiene el material 10,20 y


30,
> pero como tiene más material (el 40,50 y 60) , no me sirve...
> Con el IdRefEnvio3 pasa lo mismo, tiene el material 10 y 20, pero como


no
> tiene el 30 no lo necesito.
>
> En definitiva, si en la tabla de referencias existe un envio con el


mismo
> material que hay en Envio, necesito su IdRefEnvio.
>
> La tabla envios puede tener un gran numero de registros, por lo que
> necesitaria la forma mas rápida de obtener el IdRefEnvio...
>
> Espero haberme explicado bien
>
> Y seguramente es muy simple, pero la unica forma que veo es realizar
varias
> comprobaciones para obtenerlo y no se si estará bien hecho
> (en cuanto a velocidad... y esas cosas)
>
> Espero sus sugerencias.
> Un saludo a todos,
>
> Daniel R.
>
>


Respuesta Responder a este mensaje
#5 Lara
03/09/2003 - 17:30 | Informe spam
Sí, ya la he visto. Una consulta muy interesante. Ya la he anotado :-)
Saludos



"Liliana Sorrentino" escribió en el mensaje
news:
Lara,

gracias por la corrección, no tuve en cuenta que podía darse ese caso con


la
información.
Tu query funciona bien, pero date una vuelta por lo publicado por Javier,


su
plan de ejecución es muy eficiente.
Como ves, todos aprendemos en este grupo.

Saludos... Liliana.

"Lara" escribió en el mensaje
news:
> Hola,
>
> No soy muy experta, pero llevaba un rato dándole vueltas. Cuando he


visto
> la consulta de Liliana la he probado, y creo que hay un caso en el que


la
> consulta no es válida. Prueba a añadir estos tres registros a tu


ejemplo:
>
> IdRefEnvio IdMaterial
> 4 10
> 4 20
> 4 50
>
> Si posteriormente pruebas su consulta, el resultado será IdRefEnvio = 1


y
4,
> cuando sólo debe ser el IdRefEnvio 1, ya que el IdMaterial 50 no lo


tenías
> en tu tabla.
>
> Gracias a la consulta de Liliana, y dándoles más vueltas ... he llegado


a
> esta consulta, y creo que funciona, aunque no te aseguro el buen
> rendimiento
>
> SELECT Ref.IdRefEnvio
> FROM ReferenciasEnvios Ref
> WHERE Ref.IdRefEnvio not in
> (SELECT Ref1.IdRefEnvio
> FROM ReferenciasEnvios Ref1
> WHERE Ref1.idmaterial NOT IN (SELECT E.IdMaterial FROM Envio E))
> GROUP BY Ref.IdRefEnvio
> HAVING count(*) = (SELECT count(*) FROM Envio)
>
>
> Saludos y gracias por todas vuestras aportaciones. Estoy aprendiendo
> muchísimo!
>
>
>
> "Daniel Rodriguez" escribió en el mensaje
> news:
> > Hola a todos!!
> >
> > Antes de nada, muchas gracias por el interes que demostrais...
> >
> > Bueno, esta es una facilita sobre la mejor forma de obtener los datos
> > deseados... os cuento.
> >
> > Tengo una tabla Envio y otra ReferenciasEnvios
> >
> > La de Envio simplemente consta de un campo IdMaterial (son enteros


para
> > identificar diferentes objetos)
> > Por ejemplo,
> > IdMaterial
> >
> > 10
> > 20
> > 30
> >
> >
> > La de referencias envios en definitiva es asi:
> >
> > IdRefEnvio IdMaterial
> > 1 10
> > 1 20
> > 1 30
> > 2 10
> > 2 20
> > 2 30
> > 2 40
> > 2 50
> > 2 60
> > 3 10
> > 3 20
> >
> >
> > Lo que quiero es saber cual es la forma más rápida para saber si


existe
> > algun IdRefEnvio que contenga el material de la Tabla Envio.
> >
> > En este caso, obtener el IdRefEnvio 1, que tiene los IdMaterial
contenidos
> > en la tabla Envio, ni más material, ni menos material... el mismo.
> >
> > Como veis, el envio IdRefEnvio 2 tambien contiene el material 10,20 y
30,
> > pero como tiene más material (el 40,50 y 60) , no me sirve...
> > Con el IdRefEnvio3 pasa lo mismo, tiene el material 10 y 20, pero como
no
> > tiene el 30 no lo necesito.
> >
> > En definitiva, si en la tabla de referencias existe un envio con el
mismo
> > material que hay en Envio, necesito su IdRefEnvio.
> >
> > La tabla envios puede tener un gran numero de registros, por lo que
> > necesitaria la forma mas rápida de obtener el IdRefEnvio...
> >
> > Espero haberme explicado bien
> >
> > Y seguramente es muy simple, pero la unica forma que veo es realizar
> varias
> > comprobaciones para obtenerlo y no se si estará bien hecho
> > (en cuanto a velocidad... y esas cosas)
> >
> > Espero sus sugerencias.
> > Un saludo a todos,
> >
> > Daniel R.
> >
> >
>
>


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