Ayuda con consulta INTERSECT please...

23/05/2005 - 17:25 por JorTriFa | Informe spam
Hola a todos,

Tengo la siguiente consulta (quiero todas las emrpesas que realizan el
servicio 102 y 104):

SELECT idEmpresa
FROM ServiciosRealizaEmpresa
WHERE idservicio = 102
INTERSECT
SELECT idEmpresa
FROM ServiciosRealizaEmpresa
WHERE idservicio = 104

y la consuta me da un errorpuedo utilizar la sentencia INTERSECT??

Existe otra forma de hacerlo?

La tabla, tiene los siguientes valores: (se supone que me deberia dar las
empresas 13 y 15)

idEmpresa idservicio
11 101
11 102
11 201
11 202
11 204
11 205
12 102
12 103
13 101
13 102
13 104
14 101
14 201
14 202
14 204
14 401
15 102
15 104
15 201
15 204

Gracias a to2

Preguntas similare

Leer las respuestas

#11 Don Roque
23/05/2005 - 20:07 | Informe spam
yo haria

select * from
(
select count(*) as cuantos, idempresa
from ServiciosRealizaEmpresa
where idservicio in (102, 104)
group by idempresa

) a
where cuantos = 2
Respuesta Responder a este mensaje
#12 Maxi
23/05/2005 - 20:28 | Informe spam
Hola, pues hay muchas maneras de hacerlo ;) porque no te gusta el UNION?


Salu2
Maxi


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

Para asegurar que ambos servicios estan siendo usados puedes usar algo asi
como:

...
having count(distinct idservicio) = 2

o tambien puedes usar en este caso (solamente son dos servicios):

...
having min(idservicio) != max(idservicio)

sin necesidad de hacer una union.


Ejemplo:

select
idEmpresa
from
t1
where
idservicio in (102, 104)
group by
idEmpresa
having
min(idservicio) != max(idservicio)
go


select
idEmpresa
from
t1
where
idservicio in (102, 104)
group by
idEmpresa
having
count(distinct idservico) = 2
go


AMB

"Maxi" wrote:

Hola, entendido, entonces podemos usar algo asi como

SELECT T.IDEMPRESA,COUNT(*) FROM

(SELECT idEmpresa
FROM ServiciosRealizaEmpresa
WHERE idservicio In = 102
UNION ALL
SELECT idEmpresa
FROM ServiciosRealizaEmpresa
WHERE idservicio In = 104) T
GROUP BY T.IDEMPRESA
HAVING COUNT(*) = 2






Salu2
Maxi


"JorTriFa" escribió en el mensaje
news:
> Ya pero si lo hago con << where idservicio in(102,104) >> me da todas
> las
> empresas que realizan el servicio 102 -o- 104 y yo lo que quiero es las
> que
> hagan el servicio 102 -y- 104
>
>
> "Eleazar" escribió en el mensaje
> news:%
>> en lugar de la instruccion intersect remplazala por la instruccion
>> union
>> o prueba con esto
>> SELECT Distinct idEmpresa
>> FROM ServiciosRealizaEmpresa
>> WHERE idservicio In (102, 104)
>> suerte
>>
>> "JorTriFa" escribió en el mensaje
>> news:
>> > Hola a todos,
>> >
>> > Tengo la siguiente consulta (quiero todas las emrpesas que realizan
>> > el
>> > servicio 102 y 104):
>> >
>> > SELECT idEmpresa
>> > FROM ServiciosRealizaEmpresa
>> > WHERE idservicio = 102
>> > INTERSECT
>> > SELECT idEmpresa
>> > FROM ServiciosRealizaEmpresa
>> > WHERE idservicio = 104
>> >
>> > y la consuta me da un errorpuedo utilizar la sentencia
>> > INTERSECT??
>> >
>> > Existe otra forma de hacerlo?
>> >
>> > La tabla, tiene los siguientes valores: (se supone que me deberia
>> > dar
> las
>> > empresas 13 y 15)
>> >
>> > idEmpresa idservicio
>> > 11 101
>> > 11 102
>> > 11 201
>> > 11 202
>> > 11 204
>> > 11 205
>> > 12 102
>> > 12 103
>> > 13 101
>> > 13 102
>> > 13 104
>> > 14 101
>> > 14 201
>> > 14 202
>> > 14 204
>> > 14 401
>> > 15 102
>> > 15 104
>> > 15 201
>> > 15 204
>> >
>> > Gracias a to2
>> >
>> >
>>
>>
>
>



Respuesta Responder a este mensaje
#13 Alejandro Mesa
23/05/2005 - 20:36 | Informe spam
Don Roque,

Dara el mismo resultado, pero no hace falta una tabla derivada para hacer
eso. Puedes hacer la pregunta en la clausula HAVING select.

select idempresa
from ServiciosRealizaEmpresa
where idservicio in (102, 104)
group by idempresa
having count(distinct idservicio) = 2


AMB

"Don Roque" wrote:

yo haria

select * from
(
select count(*) as cuantos, idempresa
from ServiciosRealizaEmpresa
where idservicio in (102, 104)
group by idempresa

) a
where cuantos = 2


Respuesta Responder a este mensaje
#14 Alejandro Mesa
23/05/2005 - 21:34 | Informe spam
Maxi,

Hola, pues hay muchas maneras de hacerlo ;) porque no te gusta el UNION?



Porque la solucion con "union all" adiciona una operacion join por cada item
en la lista a verificar (por cada select). Veamos un ejemplo en la base de
datos northwind, activando "Show Execution Plan ctrl-k" en el QA.

use northwind
go

dbcc freeproccache
go

select
orderid
from
dbo.[order details]
where
productid in (24, 46, 60)
group by
orderid
having count(distinct productid) = 3
go

dbcc freeproccache
go

select
orderid
from
(
select orderid from dbo.[order details] where productid = 24
union all
select orderid from dbo.[order details] where productid = 46
union all
select orderid from dbo.[order details] where productid = 60
) as t
group by
orderid
having
count(*) = 3
go

Fijate en el costo relativo al batch de ambas sentencias. Imaginemos que la
lista es variable, entonces habria que modificar la sentencia select y
agregarle o quitar de la union las sentecias correspondientes a los items que
se quieren o no se quieren. En los casos en que la lista es variable, es
recomendable usar una variable tipo tabla (o una tabla temporal con indice),
hacer un inner join y comparar en la clausula HAVING que el conteo de los
distintos items que macharon es igual al numero de filas en la variable tipo
tabla.

Ejemplo:

declare @t1 table (c1 int unique)

insert into @t1 values(24)
insert into @t1 values(46)
insert into @t1 values(60)

select
a.orderid
from
dbo.[order details] as a
inner join
@t1 as b
on a.productid = b.c1
group by
orderid
having count(distinct productid) = (select count(*) from @t1)
go

Esta solucion resulta en un costo mayor pero no requiere que se modifique la
sentencia.


AMB

"Maxi" wrote:

Hola, pues hay muchas maneras de hacerlo ;) porque no te gusta el UNION?


Salu2
Maxi


"Alejandro Mesa" escribió en el
mensaje news:
> Maxi,
>
> Para asegurar que ambos servicios estan siendo usados puedes usar algo asi
> como:
>
> ...
> having count(distinct idservicio) = 2
>
> o tambien puedes usar en este caso (solamente son dos servicios):
>
> ...
> having min(idservicio) != max(idservicio)
>
> sin necesidad de hacer una union.
>
>
> Ejemplo:
>
> select
> idEmpresa
> from
> t1
> where
> idservicio in (102, 104)
> group by
> idEmpresa
> having
> min(idservicio) != max(idservicio)
> go
>
>
> select
> idEmpresa
> from
> t1
> where
> idservicio in (102, 104)
> group by
> idEmpresa
> having
> count(distinct idservico) = 2
> go
>
>
> AMB
>
> "Maxi" wrote:
>
>> Hola, entendido, entonces podemos usar algo asi como
>>
>> SELECT T.IDEMPRESA,COUNT(*) FROM
>>
>> (SELECT idEmpresa
>> FROM ServiciosRealizaEmpresa
>> WHERE idservicio In = 102
>> UNION ALL
>> SELECT idEmpresa
>> FROM ServiciosRealizaEmpresa
>> WHERE idservicio In = 104) T
>> GROUP BY T.IDEMPRESA
>> HAVING COUNT(*) = 2
>>
>>
>>
>>
>>
>>
>> Salu2
>> Maxi
>>
>>
>> "JorTriFa" escribió en el mensaje
>> news:
>> > Ya pero si lo hago con << where idservicio in(102,104) >> me da todas
>> > las
>> > empresas que realizan el servicio 102 -o- 104 y yo lo que quiero es las
>> > que
>> > hagan el servicio 102 -y- 104
>> >
>> >
>> > "Eleazar" escribió en el mensaje
>> > news:%
>> >> en lugar de la instruccion intersect remplazala por la instruccion
>> >> union
>> >> o prueba con esto
>> >> SELECT Distinct idEmpresa
>> >> FROM ServiciosRealizaEmpresa
>> >> WHERE idservicio In (102, 104)
>> >> suerte
>> >>
>> >> "JorTriFa" escribió en el mensaje
>> >> news:
>> >> > Hola a todos,
>> >> >
>> >> > Tengo la siguiente consulta (quiero todas las emrpesas que realizan
>> >> > el
>> >> > servicio 102 y 104):
>> >> >
>> >> > SELECT idEmpresa
>> >> > FROM ServiciosRealizaEmpresa
>> >> > WHERE idservicio = 102
>> >> > INTERSECT
>> >> > SELECT idEmpresa
>> >> > FROM ServiciosRealizaEmpresa
>> >> > WHERE idservicio = 104
>> >> >
>> >> > y la consuta me da un errorpuedo utilizar la sentencia
>> >> > INTERSECT??
>> >> >
>> >> > Existe otra forma de hacerlo?
>> >> >
>> >> > La tabla, tiene los siguientes valores: (se supone que me deberia
>> >> > dar
>> > las
>> >> > empresas 13 y 15)
>> >> >
>> >> > idEmpresa idservicio
>> >> > 11 101
>> >> > 11 102
>> >> > 11 201
>> >> > 11 202
>> >> > 11 204
>> >> > 11 205
>> >> > 12 102
>> >> > 12 103
>> >> > 13 101
>> >> > 13 102
>> >> > 13 104
>> >> > 14 101
>> >> > 14 201
>> >> > 14 202
>> >> > 14 204
>> >> > 14 401
>> >> > 15 102
>> >> > 15 104
>> >> > 15 201
>> >> > 15 204
>> >> >
>> >> > Gracias a to2
>> >> >
>> >> >
>> >>
>> >>
>> >
>> >
>>
>>
>>



Respuesta Responder a este mensaje
#15 Don Roque
24/05/2005 - 14:28 | Informe spam
Es cierto. En realidad, uso las tablas derivadas porque por lo menos a
mi me facilitan la comprension en el momento de armar los queries.
Igualmente, estimo que en grandes cantidades de datos, debe ser mejor
evitarlas. Que opinas vos?
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida