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
#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:
Mostrar la cita
#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:

Mostrar la cita
#14 Alejandro Mesa
23/05/2005 - 21:34 | Informe spam
Maxi,

Mostrar la cita
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:

Mostrar la cita
#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?
Ads by Google
Search Busqueda sugerida