Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Select anidado (https://www.clubdelphi.com/foros/showthread.php?t=29740)

erika.martinez 31-01-2006 16:51:57

Select anidado
 
Hola ¿cómo andan? Espero que todo bien.
Estoy trabajando en el desarrollo de un software que busca genes en genomas de distintos organismos. Tengo dos tablas, una que se llama GenesOriginal, donde tengo almacenados los genes conocidos para el organismo que estoy estudiando, y otra que se llama GenesSoft donde tengo almacenados los genes que encuentra mi algoritmo.
Una vez que tengo cargadas las dos tablas, lo que quiero es hacer una comparación entre estas para saber que genes encontró mi algoritmo y que pertencen al organismo, cuales no, etc. Para esto uso un select anidado. La cuestión es que el resultado que obtengo no es el mismo si trabajo sobre una tabla o sobre otra, y a mi me parece que debería obtener lo mismo.

La sentencia que utilizo para trabajar sobre la tabla GenesOriginales es la siguiente:

Update GenesOriginal
Set Encontrado = True
where pkGenesOriginal in (Select pkGenesOriginal from GenesOriginal
where InicioGen in (Select InicioGen from GenesSoft)
or FinGen in (Select FinGen from GenesSoft))

donde Encontrado es una variable que inicialmente está seteada a False y cuyo valor cambia si algun gen de GenesSoft tiene el mismo inicio (InicioGen) o el mismo fin (FinGen) que un gen de la tabla GenesOriginal.

Después de esto ejecuto: Select count(pkGenesOriginal) from GenesOriginal where Encontrado = True, y obtengo, por ejemplo 467.

Ahora, la sentencia que utilizo para trabajar sobre la tabla GenesSoft es la siguiente:

Update GenesSoft
Set Encontrado = True
where pkGenesSoft in (Select pkGenesSoft from GenesSoft
where InicioGen in (Select InicioGen from GenesOriginal)
or FinGen in (Select FinGen from GenesOriginal))

Después de esto ejecuto: Select count(Soft) from GenesSoft where Encontrado = True, y obtengo, en este caso 462.

¿porqué resultados diferentes? ¿no debería obtener el mismo número?

Desde ya muchas gracias, saludos a todos

Erika

Ivanzinho 02-02-2006 09:21:37

Las dos consulta serían iguales solo en el caso de que los campos FinGen e InicioGen sean únicos. Si se puede dar la casualidad de que dos registros puedan tener el mismo FinGen o el mismo InicioGen las consultas no tendrían porque dar el mismo resultado.

Por ejemplo si tienes las siguiente tablas

GenesOriginal --> Registros
GEN FINGEN INICIOGEN
1 AA BB
2 AC DF
3 AF BB

GenesSoft --> Registros
GEN TINGEN INICIOGEN
1 AA BB

En este caso la consulta
Código SQL [-]
Update GenesOriginal
Set Encontrado = True
where pkGenesOriginal in (Select pkGenesOriginal from GenesOriginal
where InicioGen in (Select InicioGen from GenesSoft)
or FinGen in (Select FinGen from GenesSoft))
Modificaria dos registros, por lo que el resultado de
Código SQL [-]
Select count(pkGenesOriginal) from GenesOriginal where Encontrado = True
Devolvería 2

Sim embargo la consulta
Código SQL [-]
Update GenesSoft
Set Encontrado = True
where pkGenesSoft in (Select pkGenesSoft from GenesSoft
where InicioGen in (Select InicioGen from GenesOriginal)
or FinGen in (Select FinGen from GenesOriginal))
Modificaría un solo registro, por lo que al lanzar la consulta
Código SQL [-]
Select count(Soft) from GenesSoft where Encontrado = True
Obtendrías como resultado 1.

Espero haberme explicado y que te sirva de ayuda.

Un saúdo

erika.martinez 02-02-2006 12:19:57

Si, entiendo, y tenés razón. Pasa que supuestamente deberían darme igual, pero debo tener un error en la carga de los datos.
Muchas gracias por tu respuesta.
Saludos


La franja horaria es GMT +2. Ahora son las 15:20:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi