Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

[SOLUCIONADO] Sustituir valores en una columna por otros de una tabla diferente

Estas en el tema de Sustituir valores en una columna por otros de una tabla diferente en el foro de PostgreSQL en Foros del Web. Hola: No sé por qué se ha borrado el hilo previo, pero aprovecho para formular la pregunta mejor: Parto de estas tablas: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código ...
  #1 (permalink)  
Antiguo 10/06/2015, 15:10
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Sustituir valores en una columna por otros de una tabla diferente

Hola:

No sé por qué se ha borrado el hilo previo, pero aprovecho para formular la pregunta mejor:

Parto de estas tablas:

Código SQL:
Ver original
  1. parcelas:
  2.  
  3. id | Parcela | Municipio
  4. ---------------------------
  5.  1 | Parcela1 | Municipio1
  6.  2 | Parcela2 | Municipio2
  7.  3 | Parcela3 | Municipio1

Código SQL:
Ver original
  1. municipio:
  2.  
  3. id | nombre
  4. --------------
  5.  1 | Municipio1
  6.  2 | Municipio2

Entonces quiero borrar la columna de los Municipios en la primera tabla, y sustituirla por una id que haga referencia a la segunda.

Primero creo una columna nueva: id_municipio en la primera tabla.
Y luego intento hacer lo siguiente:

Código SQL:
Ver original
  1. UPDATE parcelas SET id_municipio=(SELECT municipio.id FROM municipio WHERE municipio.nombre=parcelas.municipio);

Pero me arroja este error:
ERROR: more than one row returned by a subquery used as an expression

Por lo cual entiendo que el producto de la selección me devuelve varias filas. Y no sé cómo hacer para limitarlo a cada fila a actualizar.

Como siempre, se agradece la ayuda...una vez más.
__________________
Mi calculadora en Qt
  #2 (permalink)  
Antiguo 11/06/2015, 04:50
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Sustituir valores en una columna por otros de una tabla diferente

Si limito el "update" a una fila concreta:

Código SQL:
Ver original
  1. UPDATE parcelas SET id_municipio=(SELECT municipio.id FROM municipio WHERE municipio.nombre=parcelas.municipio) WHERE parcelas.id='1' ;

Y funciona. Pero no sé cómo hacerlo con todas las filas.
Sobre esa base, se me ocurre esta función, pero hay algo que no va: (me da error en la variable 'x')
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION actualizar_id_mun() RETURNS void AS
  2. $BODY$
  3. DECLARE
  4. x INT;
  5. BEGIN
  6. x:=1;
  7. WHILE (x<SELECT COUNT(*) FROM socios) LOOP
  8. UPDATE parcelas SET id_municipio=(SELECT municipio.id FROM municipio WHERE municipio.nombre=parcelas.municipio) WHERE parcelas.id=x;
  9. x++;
  10. END LOOP;
  11. END;
  12. $BODY$
  13. LANGUAGE SQL VOLATILE NOT LEAKPROOF
  14. COST 100;
__________________
Mi calculadora en Qt

Última edición por dehm; 11/06/2015 a las 05:32
  #3 (permalink)  
Antiguo 11/06/2015, 06:05
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Sustituir valores en una columna por otros de una tabla diferente

Corregidos los múltiples errores de sintaxis, la función sería:
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION actualizar_id_mun() RETURNS void AS
  2.     $BODY$
  3.     DECLARE
  4.     x INTEGER;
  5.     BEGIN
  6.     x:=1;
  7.     WHILE (x<SELECT COUNT(*) FROM parcelas) LOOP
  8.     UPDATE parcelas SET id_municipio=(SELECT municipio.id FROM municipio WHERE municipio.nombre=parcelas.municipio) WHERE parcelas.id=x;
  9.     x:=x+1;
  10.     END LOOP;
  11.     END;
  12.     $BODY$
  13.     LANGUAGE plpgsql VOLATILE
  14.     COST 100;

Pero al ejecutarla me vuelve a dar el error de:
ERROR: more than one row returned by a subquery used as an expression
__________________
Mi calculadora en Qt
  #4 (permalink)  
Antiguo 11/06/2015, 08:46
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Sustituir valores en una columna por otros de una tabla diferente

Bueno, pues doy el tema por solucionado.
No sé si será la mejor forma, pero esta función me ha resuelto la papeleta.

El problema estaba en que en el proyecto real, estoy usando unas tablas de municipios del INE, y resulta que hay algún caso de nombres de municipios repetidos. Para solventar eso, he limitado el select a 1, lo que me hace de forma arbitraria que esa id se asocie al primer municipio con ese nombre en la tabla municipios, pero creo que más no se puede hacer. Algún caso habrá que esté equivocado.

Si tuviera más datos como el CP, ese error se podría solventar, pero no dispongo de él.

Saludos y gracias. Pongo la versión definitiva de la función con el "limit"
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION actualizar_id_mun() RETURNS void AS
  2.         $BODY$
  3.         DECLARE
  4.         x INTEGER;
  5.         BEGIN
  6.         x:=1;
  7.         WHILE x<(SELECT COUNT(*) FROM parcelas) LOOP
  8.         UPDATE parcelas SET id_municipio=(SELECT municipio.id FROM municipio WHERE municipio.nombre=parcelas.municipio LIMIT 1) WHERE parcelas.id=x;
  9.         x:=x+1;
  10.         END LOOP;
  11.         END;
  12.         $BODY$
  13.         LANGUAGE plpgsql VOLATILE
  14.         COST 100;
__________________
Mi calculadora en Qt

Última edición por dehm; 11/07/2015 a las 09:03

Etiquetas: columna, diferente, sustituir, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:14.