Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Interpretar SQL (https://www.clubdelphi.com/foros/showthread.php?t=45638)

juanpe 10-07-2007 11:26:24

Interpretar SQL
 
Muy buenas.
Tengo una duda con la siguiente SQL a ver si conseguimos aclarar.

Esta SQL debería borrar todo de la tabla estudios donde un id_paciente tiene un nº determinado de estudios (esto es el igual del having count(estudio)= 1 )

delete from estudios where id_paciente in (select id_paciente from estudios group by id_paciente having count(estudio) = 1)

Pues bien, para todos aquellos id_paciente que tienen un único estudio lo hace fenomenal, borra todos.

Pero si aumentamos los estudios por id_paciente ya no lo hace bien, por ejemplo 2 estudios por id_paciente.

delete from estudios where id_paciente in (select id_paciente from estudios group by id_paciente having count(estudio) = 2)

Para situaros, si en la bd tengo 4 registros de 2 id_pacientes distitnos

ESTUDIOS ID_PACIENTE
-----1------------1
-----2------------1
-----3------------2
-----4------------2

y hago la SQL anterior
delete from estudios where id_paciente in (select id_paciente from estudios group by id_paciente having count(estudio) = 2)

el resultado es que borra el primer registro de cada id_paciente, pero no lo borra completamente y necesito que así fuera.

ESTUDIOS ID_PACIENTE
-----2------------1
-----4------------2

Uso IB 7.5.
Perdon por el tochazo pero no sabia explicarme mejor y mas corto.
Gracias por la ayuda.

PepeLolo 10-07-2007 15:23:16

hola, la SQL se reduce a:
Código SQL [-]
Delete from estudios A where exists (select B.id_paciente from estudios B where b.id_paciente = a.id_paciente)

hasta lugo.

juanpe 10-07-2007 16:56:54

Muchas gracias por responder PepeLolo, pero me he equivocado al expresarme.
Cuando digo que "no la borra completamente" me refiero a todos los id_paciente que cumplen la subconsulta. No me referia a todos los registros de la tabla :( .

A ver si ahora me explico mejor:

Quiero borrar todos los registros de una tabla que cumplen que tienen un nº determinado de estudios.

La consulta de borrar todo es la siguiente:
delete from estudios
Ahora necesito referenciar los registros a traves de un campo, en este caso Id_paciente
where id_paciente in
y ahora solo quiero los id_pacientes agrupados que tienen en total 2 estudio
(select id_paciente from estudios group by id_paciente having count(estudio) = 2)

Pues no me funciona del todo correctamente, ya que como explico en el primer mensaje, elimina solo el primer registro de cada id_paciente que cumple la subconsulta, dejando un registro de esos id_paciente que deberian ser borrado tb.

Gracias de nuevo

TJose 11-07-2007 01:48:15

Hola juanpe

has revisado que valores te devuelve la sentecia
Código SQL [-]
select id_paciente from estudios group by id_paciente having count(estudio) = 2

Saludos
TJose

juanpe 11-07-2007 10:07:58

Cita:

Empezado por TJose
Hola juanpe

has revisado que valores te devuelve la sentecia

Código SQL [-]
select id_paciente from estudios group by id_paciente having count(estudio) = 2





Saludos
TJose

Buenas TJose, gracias por responder.
Si, está revisado.

Para dejarlo mas claro aún, esta seria mi tabla:

ESTUDIOS ID_PACIENTE
-----1------------1
-----2------------1
-----3------------2
-----4------------2
-----5------------3
-----6------------4

Esta Sql
select id_paciente from estudios group by id_paciente having count(estudio) = 2
devuelve dos valores id_paciente 1,2, que son exactamente los registros que quiero borrar, todos los registros del id_paciente 1 y 2 quedando la tabla asi:

ESTUDIOS ID_PACIENTE
-----5------------3
-----6------------4

Y la verdad que no comprendo porque lo hace. Porque si tu haces la sql de borrar para todos los id_pacientes que tienen solo un estudio... delete from estudios where id_paciente in (select id_paciente from estudios group by id_paciente having count(estudio) = 1)
e imaginando de nuevo que nuestra tabla es la siguiente:

ESTUDIOS ID_PACIENTE
-----1------------1
-----2------------2
-----3------------3
-----4------------4
-----5------------5
-----6------------6

El resultado es correcto elimina TODOS LOS REGISTROS. OK!!

ESTUDIOS ID_PACIENTE
----- ------------
----- ------------
----- ------------
----- ------------
----- ------------
----- ------------

Un saludo y gracias.


La franja horaria es GMT +2. Ahora son las 17:32:25.

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