Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Como mejorar sentencia "not in" (https://www.clubdelphi.com/foros/showthread.php?t=44794)

juanpe 14-06-2007 17:27:54

Como mejorar sentencia "not in"
 
Buenas tardes a todos y gracias por anticipado.
Tengo un problema de tiempos con una consulta.

Tengo dos tablas, pacientes y estudios.
Cuando se borran un nº determinado de estudios, quiero consultar cuales son los pacientes que "ya no tienen estudios", (ya que han sido borrados anteriormente).

Esto lo hago asi:

select paciente.id_paciente from paciente where paciente.id_paciente not in (select id_paciente from estudios)

El problema es que es muy lento.
He intentado hacer esto tb:

select paciente.id_paciente from paciente, estudios where paciente.id_paciente <> estudios.id_paciente

Pero no devuelve lo que espero, me devuelve registros que existen en paciente.


Alguna ayudita.
Muchas gracias.

gluglu 14-06-2007 17:45:50

Código SQL [-]
Select p.id_paciente, e.id_paciente as Tiene_Estudios
from paciente p
left join estudios e
  on e.id_paciente = p.id_paciente
where Tiene_Estudios is Null

kuan-yiu 14-06-2007 17:51:50

Y si tu motor de base de datos no admite "left join" puedes ver si funciona así:
Código SQL [-]
Select p.*, e.id_paciente
from paciente p,
     estudios e
where e.id_paciente(+) = p.id_paciente
      and e.id_paciente is Null

juanpe 14-06-2007 17:58:31

Muchas gracias por ayudarme tan pronto.
Lo cierto es que uso Interbase y estoy intentando traducirlo con el Ib console, pero me falla algo... :S,

select paciente.id_paciente,estudios.id_paciente as Tiene_Estudios
from paciente
left join paciente.id_paciente
on estudios.id_paciente = paciente.id_paciente
where tiene_estudios is null

Estoy viendo si consigo resolverlo.
De nuevo gracias

Editado,

Para comprender el error en ibconsole lo pongo todo en una linea seguido. El error me lo devuelve en left join paciente. (aqui) despues del punto.
Me dice "Token unknown". linea 1 character 99.

gluglu 14-06-2007 18:03:50

Código SQL [-]
select paciente.id_paciente, estudios.id_paciente as Tiene_Estudios 
from paciente 
left join estudios 
on estudios.id_paciente = paciente.id_paciente 
where tiene_estudios is null

juanpe 14-06-2007 18:18:07

Muchas gracias de nuevo por ayudarme, de veras, no quiero ser pesado.

Corregido el error, ahora me dice que la columna Tiene_estudios es desconocida.

select paciente.id_paciente, estudios.id_paciente as Tiene_Estudios
from paciente
left join estudios
on estudios.id_paciente = paciente.id_paciente
where tiene_estudios is null

Tambien he comprobado que interbase permite hacer el "as", por lo que ahora no se que mas probar.

juanpe 14-06-2007 18:31:45

Gluglu, he conseguido ejecutarla de esta manera, sin el as, y sigue igual de lento.

select paciente.id_paciente, estudios.id_paciente
from paciente
left join estudios
on estudios.id_paciente = paciente.id_paciente
where estudios.id_paciente is null

Con el As, me genera el error que no consigo solucionar.

Muchas gracias por vuestro tiempo chicos/as.
Un saludo.

gluglu 14-06-2007 18:54:31

No conozco el tamaño de tu Base de Datos y de las tablas que mencionas. Pero si te parece lenta la respuesta es porque seguro no utilizas índices. Consulta en el foro acerca de los índices en Interbase. Te saldrá mucha información al respecto.

El uso de índices referenciados a tus claves primarias acelerará tu consulta de manera dramática. ;)


La franja horaria es GMT +2. Ahora son las 00:20:51.

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