Consulta

28/10/2005 - 20:54 por Enric | Informe spam
Hola,
Tengo estas tablas:
-tblFotos (lngCodiFoto int)
-tblImatge(lngCodiImatge int)
-tblImatgeFoto (lngCodiFoto int, lngCodiImatge)

con estos datos:
tblFotos:
lngCodiFoto
1
2
3
4

tblImatge
lngCodiImatge
10
11
12

tblImatgeFoto
lngCodiFoto lngCodiImatge
1 10
1 12
2 10
2 11

Y debo hace consultas del tipo:
- Todas la fotos que NO contengan la imagen 12 (a partir de la relaciom de
la tabla tblImatgeFoto)
- Todas las fotos que contengan la imagen 10 o 12 pero no la 11...

Es decir: el cliente quiere poder hacer una consulta del tipo: "Quiero todas
las fotos, en las que aparezcan árboles y flores. Tanto me dá de que
aparezcan personas, pero sobretodo quiero que no aparezcan perros"

El problema es que la tabla tblFoto conitiene unos 40.000 registros y la
tabla tblImatge unos 40 (y aqui el problema). Yo habia pensado en utilizar
la clausula IN y NOT IN, pero se me complican mucho las consultas cuando los
criterios son complejos.

Voy a tener que crear consultas monstruosas? o hay alguna forma sencilla de
hacerlo?

Muchas grácias
Enric
 

Leer las respuestas

#1 Alejandro Mesa
29/10/2005 - 03:15 | Informe spam
Trata:

- Todas la fotos que NO contengan la imagen 12 (a partir de la relaciom de
la tabla tblImatgeFoto)



select a.*
from
tblFotos as a
where
not exists(
select *
from tblImatgeFoto as b
where b.lngCodiFoto = a.lngCodiFoto and b.lngCodiImatge = 12
)


select a.*
from
tblFotos as a
left join
(
select lngCodiFoto from tblImatgeFoto where lngCodiImatge = 12
) as b
on a.lngCodiFoto = b.lngCodiFoto
where
b.lngCodiFoto is null
go

- Todas las fotos que contengan la imagen 10 o 12 pero no la 11...



select a.*
from
tblFotos as a
where
exists(
select *
from tblImatgeFoto as b
where
b.lngCodiFoto = a.lngCodiFoto
and (b.lngCodiImatge = 10 or b.lngCodiImatge = 12)
) and
not exists (
select *
from tblImatgeFoto as b
where b.lngCodiFoto = a.lngCodiFoto and b.lngCodiImatge = 11
)
go


AMB

"Enric" wrote:

Hola,
Tengo estas tablas:
-tblFotos (lngCodiFoto int)
-tblImatge(lngCodiImatge int)
-tblImatgeFoto (lngCodiFoto int, lngCodiImatge)

con estos datos:
tblFotos:
lngCodiFoto
1
2
3
4

tblImatge
lngCodiImatge
10
11
12

tblImatgeFoto
lngCodiFoto lngCodiImatge
1 10
1 12
2 10
2 11

Y debo hace consultas del tipo:
- Todas la fotos que NO contengan la imagen 12 (a partir de la relaciom de
la tabla tblImatgeFoto)
- Todas las fotos que contengan la imagen 10 o 12 pero no la 11...
.
Es decir: el cliente quiere poder hacer una consulta del tipo: "Quiero todas
las fotos, en las que aparezcan árboles y flores. Tanto me dá de que
aparezcan personas, pero sobretodo quiero que no aparezcan perros"

El problema es que la tabla tblFoto conitiene unos 40.000 registros y la
tabla tblImatge unos 40 (y aqui el problema). Yo habia pensado en utilizar
la clausula IN y NOT IN, pero se me complican mucho las consultas cuando los
criterios son complejos.

Voy a tener que crear consultas monstruosas? o hay alguna forma sencilla de
hacerlo?

Muchas grácias
Enric








Preguntas similares