SQL - DELETE de un SELECT (URGENTE!!)

 
Vista:

DELETE de un SELECT (URGENTE!!)

Publicado por Alejandro (3 intervenciones) el 12/01/2012 22:01:40
Hola,

Necesito borrar los registros de una tabla que coincidan con este SELECT:

SELECT PREFIL, PRETIP, PRECOD, PRECAL, PREITM - 9000, PREDES, PREHAS, PREDTO FROM TOPDAP.PREDEPNA WHERE PREITM > 9000

Es decir, necesito borrar todos los registros que coincidan con todos los campos iguales a los registros cuyo PREITM sea mayor a 9000 solo que necesito borrar los que tienen ese PREITM -9000.

Al principio se me ocurrió hacer un:
DELETE FROM TOPDAP.PREDEPNA
WHERE EXISTS (SELECT PREFIL, PRETIP, PRECOD, PRECAL, PREITM - 9000, PREDES, PREHAS, PREDTO FROM TOPDAP.PREDEPNA WHERE PREITM > 9000)

GRAVE ERROR!! Me borró toda la tabla. Ahora pedí una restauración y se me ocurrió hacer lo siguiente:

SELECT P1.PREFIL, P1.PRETIP, P1.PRECOD, P1.PRECAL, P1.PREITM, P1.PREDES, P1.PREHAS, P1.PREDTO
FROM TOPDAP.PREDEPNA AS P1, TOPDAP.PREDEPNA AS P2
WHERE P1.PREFIL = P2.PREFIL AND P1.PRETIP = P2.PRETIP AND P1.PRECOD = P2.PRECOD AND P1.PRECAL = P2.PRECAL AND P1.PREDES = P2.PREDES AND P1.PREHAS = P2.PREHAS AND P1.PREDTO = P2.PREDTO
AND P1.PREITM = P2.PREITM - 9000 AND P2.PREITM >= 9000



El SELECT selecciona los registros que deseo borrar pero necesito transformar este SELECT en un DELETE.

Alguno se le ocurre como?

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

DELETE de un SELECT (URGENTE!!)

Publicado por Juanfer (1 intervención) el 12/01/2012 22:14:42
Simplemente así:
DELETE TOPDAP.PREDEPNA WHERE PREITM > 9000

Lo que no me queda claro es lo de "necesito borrar los que tienen ese PREITM -9000"
Si lo que requieres es borrar los registros que al restarle 9000 al valor del campo PREITM de como resultado un valor mayor a 9000, pues lo haces así:
DELETE TOPDAP.PREDEPNA WHERE PREITM-9000 > 9000

que sería lo mismo que decir:
DELETE TOPDAP.PREDEPNA WHERE PREITM > 0

Aunque no le veo mucho sentido, te estás es enrredando con la clausula DELETE, recuerda que no necesariamente debe llevar una clausula SELECT, te recomiendo leer un poco la documentación del comando.

Igual acá estamos para colaborarnos, así que pregunta sin pena :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

DELETE de un SELECT (URGENTE!!)

Publicado por Alejandro (3 intervenciones) el 13/01/2012 16:01:11
Hola!

Gracias por la pronta respuesta.

El tema de hacer lo que vos decís es que borraría todos los que coincidan el PREITM -9000 y no haría caso al resto de las claves que son todas primarias.

Esta es la situación:
1) Tengo una tabla que tiene 8 columnas:
PREFIL, PRETIP, PRECOD, PRECAL, PREITM, PREDES, PREHAS, PREDTO

2) El campo PREITM es numeric(4) pero los valores actuales van del 0 al 10.

3) Existe en dicha tabla registros duplicados que deben ser borrados.

4) Como NO PUEDO USAR UNA TABLA ALTERNATIVA, inserté los registros duplicados en la misma tabla pero con el número PREITM +9000 con la idea de borrar todos los registros duplicados y luego volver a insertarlos una vez a todos los que PREITM >= 9000 (pero con -9000):
INSERT INTO TOPDAP.PREDEPNA
(SELECT PREFIL, PRETIP, PRECOD, PRECAL, 9000 + PREITM, PREDES, PREHAS, PREDTO
FROM TOPDAP.PREDEPNA
GROUP BY PREFIL, PRETIP, PRECOD, PRECAL, PREITM, PREDES, PREHAS, PREDTO
HAVING COUNT(*) > 1)

Ahora estoy en el paso de borrar todos los duplicados y es ahí donde no se me ocurre como borrar SOLO estos registros:
SELECT PREFIL, PRETIP, PRECOD, PRECAL, PREITM - 9000, PREDES, PREHAS, PREDTO FROM TOPDAP.PREDEPNA WHERE PREITM > 9000
(los que coincidan TODOS los campos, no solo el PREITM-9000)

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

DELETE de un SELECT (URGENTE!!)

Publicado por Alejandro (3 intervenciones) el 13/01/2012 16:39:22
Bueno... luego de darle varias vueltas llegué a la solución:

DELETE FROM TOPDAP.PREDEPNA AS A
WHERE EXISTS (SELECT B.PREFIL, B.PRETIP, B.PRECOD, B.PRECAL, B.PREITM, B.PREDES, B.PREHAS, B.PREDTO FROM TOPDAP.PREDEPNA AS B WHERE A.PREFIL = B.PREFIL AND A.PRETIP = B.PRETIP AND A.PRECOD = B.PRECOD AND A.PRECAL = B.PRECAL AND A.PREITM = B.PREITM AND A.PREDES = B.PREDES AND A.PREHAS = B.PREHAS AND A.PREDTO = B.PREDTO
GROUP BY B.PREFIL, B.PRETIP, B.PRECOD, B.PRECAL, B.PREITM, B.PREDES, B.PREHAS, B.PREDTO
HAVING COUNT(*) > 1)


De esta forma elimino todos los duplicados. Una vez hecho esto ya puedo continuar con el Script:

// Inserta los registros borrados pero sin duplicación

INSERT INTO TOPDAP.PREDEPNA
SELECT PREFIL, PRETIP, PRECOD, PRECAL, PREITM - 9000, PREDES, PREHAS, PREDTO
FROM TOPDAP.PREDEPNA
WHERE PREITM > 9000

GO

// Borra los registros temporales creados al inicio.

DELETE FROM TOPDAP.PREDPNA
WHERE PREITM > 9000


Gracias a todos igual por la ayuda!!

Nos vemos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar