PostgreSQL - eliminar datos duplicados

 
Vista:
sin imagen de perfil
Val: 8
Ha disminuido 1 puesto en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

eliminar datos duplicados

Publicado por sofia (3 intervenciones) el 23/09/2020 16:48:30
Buen día.
Tengo una tabla maestras con los siguientes datos

tabla patologia: los campos son los siguientes
codigo nombre
1 fiebre
2 dolor muscular
3 hepatitis
4 fiebre
5 fiebre
6 fiebre
8 hepatitis

y asi sucesivamente, con muchos valores duplicados. Tengo que eliminar esos valores duplicados, pero como actualizo la fk de la tabla referenciada personas_patologias

personas_patologias
idpersona codigo_patologia
10 1
12 1
13 2
14 1
1 3
3 4
4 5
5 6
6 7
30 8


desde ya muchas gracias.
saludos
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
Imágen de perfil de Francisco
Val: 256
Oro
Ha mantenido su posición en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

eliminar datos duplicados

Publicado por Francisco (110 intervenciones) el 23/09/2020 19:00:37
Hola

Un UPDATE, te sirve para ese proposito

1
UPDATE personas_patologias SET codigo_patologia = 1 WHERE codigo_patologia  IN ( 4,5,6 );


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
sin imagen de perfil
Val: 8
Ha disminuido 1 puesto en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

eliminar datos duplicados

Publicado por sofia (3 intervenciones) el 23/09/2020 19:51:53
Hola Francisco.


Si, si, pero tengo mas de 4 mil registros en la tabla maestra. No hay otra forma


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
Imágen de perfil de Francisco
Val: 256
Oro
Ha mantenido su posición en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

eliminar datos duplicados

Publicado por Francisco (110 intervenciones) el 24/09/2020 17:53:37
Hola

Si la hay

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
DROP TABLE IF EXISTS patologia CASCADE;
CREATE TABLE patologia(
    codigo int,
    nombre varchar,
    PRIMARY KEY (codigo)
   );
 
INSERT INTO patologia(codigo,nombre) VALUES(1, 'fiebre');
INSERT INTO patologia(codigo,nombre) VALUES(2, 'dolor muscular');
INSERT INTO patologia(codigo,nombre) VALUES(3, 'hepatitis');
INSERT INTO patologia(codigo,nombre) VALUES(4, 'fiebre');
INSERT INTO patologia(codigo,nombre) VALUES(5, 'fiebre');
INSERT INTO patologia(codigo,nombre) VALUES(6, 'fiebre');
INSERT INTO patologia(codigo,nombre) VALUES(7, 'dolor muscular');
INSERT INTO patologia(codigo,nombre) VALUES(8, 'hepatitis');
 
SELECT * FROM patologia;
 
 
DROP TABLE IF EXISTS personas_patologias;
CREATE TABLE personas_patologias(
    idpersona int,
    codigo_patologia int,
    PRIMARY KEY (idpersona),
    CONSTRAINT fk_patologia
      FOREIGN KEY(codigo_patologia)
	  REFERENCES patologia(codigo)
   );
 
 
INSERT INTO personas_patologias(idpersona,codigo_patologia) VALUES(10, 1);
INSERT INTO personas_patologias(idpersona,codigo_patologia) VALUES(12, 1);
INSERT INTO personas_patologias(idpersona,codigo_patologia) VALUES(13, 2);
INSERT INTO personas_patologias(idpersona,codigo_patologia) VALUES(14, 1);
INSERT INTO personas_patologias(idpersona,codigo_patologia) VALUES(1, 3);
INSERT INTO personas_patologias(idpersona,codigo_patologia) VALUES(3, 4);
INSERT INTO personas_patologias(idpersona,codigo_patologia) VALUES(4, 5);
INSERT INTO personas_patologias(idpersona,codigo_patologia) VALUES(5, 6);
INSERT INTO personas_patologias(idpersona,codigo_patologia) VALUES(6, 7);
INSERT INTO personas_patologias(idpersona,codigo_patologia) VALUES(30, 8);
 
SELECT * FROM personas_patologias;
 
DO
$$
DECLARE
	r record;
BEGIN
	FOR r IN
		SELECT
			nombre,
			array_agg(codigo ORDER BY codigo) patologias
		FROM patologia
		GROUP BY nombre
		ORDER BY nombre
	LOOP
		RAISE NOTICE '%', r;
		UPDATE personas_patologias
			SET codigo_patologia = r.patologias[1]
			WHERE codigo_patologia = ANY(r.patologias);
	END LOOP;
END
$$
LANGUAGE plpgsql;
 
SELECT pp.*, p.nombre
FROM personas_patologias pp
INNER JOIN patologia p ON p.codigo = pp.codigo_patologia

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