![]() |
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. |
hola, la SQL se reduce a:
hasta lugo. |
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 |
Hola juanpe
has revisado que valores te devuelve la sentecia
Saludos TJose |
Cita:
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 12:51:42. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi