Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-06-2007
juanpe juanpe is offline
Miembro
 
Registrado: oct 2004
Posts: 46
Poder: 0
juanpe Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 14-06-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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
__________________
Piensa siempre en positivo !
Responder Con Cita
  #3  
Antiguo 14-06-2007
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
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
Responder Con Cita
  #4  
Antiguo 14-06-2007
juanpe juanpe is offline
Miembro
 
Registrado: oct 2004
Posts: 46
Poder: 0
juanpe Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 14-06-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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
__________________
Piensa siempre en positivo !
Responder Con Cita
  #6  
Antiguo 14-06-2007
juanpe juanpe is offline
Miembro
 
Registrado: oct 2004
Posts: 46
Poder: 0
juanpe Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 14-06-2007
juanpe juanpe is offline
Miembro
 
Registrado: oct 2004
Posts: 46
Poder: 0
juanpe Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 14-06-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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.
__________________
Piensa siempre en positivo !
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Comentario "aplastante" contra los que atacan la "piratería" Casimiro Notevi La Taberna 12 07-03-2010 14:03:02
Necesito llamar a métodos de clases "hija" desde su clase "padre" Flecha OOP 17 20-04-2007 00:03:53
¿cuál es mejor: "close" o "application.terminate"? unreal4u Varios 5 05-03-2007 11:01:19
porque no me reconoce los caracteres "*" ni "%" cuando filtro mrmago Conexión con bases de datos 10 27-01-2006 04:21:16


La franja horaria es GMT +2. Ahora son las 09:50:48.


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
Copyright 1996-2007 Club Delphi