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

[SOLUCIONADO] Actualizar datos desde una tabla resultado de JOIN

Estas en el tema de Actualizar datos desde una tabla resultado de JOIN en el foro de Bases de Datos General en Foros del Web. Bueno, pues esta es mi duda: Estoy intentando hacer una BBDD flexible para usar con QGIS (No es lo importante, pero dejo el enlace ) ...
  #1 (permalink)  
Antiguo 14/05/2015, 09:10
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Actualizar datos desde una tabla resultado de JOIN

Bueno, pues esta es mi duda:

Estoy intentando hacer una BBDD flexible para usar con QGIS (No es lo importante, pero dejo el enlace)

Salvo que me equivoque, con QGIS no puedo trabajar de forma dinámica con varias tablas de una base de datos. Como mucho, puedo abrir algunas tablas y crear otra tabla haciendo un JOIN. (Para mi es más fácil hacer el JOIN antes de, y luego abrir la tabla resultante con QGIS).

Y ahora viene la duda:
Si yo trabajo con los datos de esta tabla producto del JOIN de otras...¿cómo puedo cambiar los datos en las tablas origen? ¿Es necesario hacer Triggers o existe otra forma?

Saludos y gracias!
__________________
Mi calculadora en Qt
  #2 (permalink)  
Antiguo 14/05/2015, 11:41
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Actualizar datos desde una tabla resultado de JOIN

La estructura estándar seria:

Código SQL:
Ver original
  1. UPDATE tabla SET columna(s) = x.valor, columna(s) = y.valor
  2. FROM
  3. TuOtraTabla AS x JOIN Unamas y ON x.id = y.id
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 15/05/2015, 05:33
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: Actualizar datos desde una tabla resultado de JOIN

Update tabla Set columna Where (condiciones que identifican el registro que quieras cambiar = sus valores) = valor.

El valor que quieres asignar puede ser el resultado de una select.

Ejemplo:

Código SQL:
Ver original
  1. UPDATE MiTablaA columna_B
  2. WHERE (columna_A="registro 3" AND columna_C="01-01-2014") = (SELECT Columna Z FROM MiTablaB
  3. WHERE (columna_Y="registro 4" AND columna_W="01-05-2015));

Si haces una select para sacar el valor... asegúrate de que la select te da un único valor, no un resultado de 4 registros ni de varias columnas, porque el update te pide un único valor para asignar a cada uno de los resultados de la selección del update. Al menos que en el update le indiques que vas a actualizar 2 columnas, en cuyo caso le debes de proporcionar 2 valores, cada uno de ellos pudiendo ser una select que devolverá 1 único valor cada 1 de ellas

Última edición por gnzsoloyo; 15/05/2015 a las 05:54
  #4 (permalink)  
Antiguo 15/05/2015, 12:54
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Actualizar datos desde una tabla resultado de JOIN

Kritik

¿Con que valor estas actualizando la columna_B?

En el script que nos muestras
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 15/05/2015, 15:40
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Actualizar datos desde una tabla resultado de JOIN

Cita:
Iniciado por iislas Ver Mensaje
La estructura estándar seria:

Código SQL:
Ver original
  1. UPDATE tabla SET columna(s) = x.valor, columna(s) = y.valor
  2. FROM
  3. TuOtraTabla AS x JOIN Unamas y ON x.id = y.id
Hola iislas:

Mas allá de la función, mi duda iba encaminada a si el método para abordar el problema que describo es hacer uso de triggers.

De todas formas, tampoco entiendo la sentencia a partir del FROM

Código C++:
Ver original
  1. ...TuOtraTabla as x join Unamas y on x.id = y.id

Gracias por la ayuda
__________________
Mi calculadora en Qt
  #6 (permalink)  
Antiguo 15/05/2015, 16:55
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Actualizar datos desde una tabla resultado de JOIN

Los TRIGGER's, fueron creados para guardar la integridad de los datos (DRI), no se recomienda su uso para la codificación de la lógica.

En cuanto a la estructura del FROM, bueno, hay mucha información en la red
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 15/05/2015, 17:47
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Actualizar datos desde una tabla resultado de JOIN

Cita:
Iniciado por iislas Ver Mensaje
Los TRIGGER's, fueron creados para guardar la integridad de los datos (DRI), no se recomienda su uso para la codificación de la lógica.

En cuanto a la estructura del FROM, bueno, hay mucha información en la red
Vaya chasco. Iba a publicar el trigger que había creado para mi ejemplo y resulta que no es esta la forma adecuada de hacerlo.
Bueno, no obstante reproduzco el ejemplo y el trigger que había hecho:

La tabla de personas:

Código SQL:
Ver original
  1. TABLE "public.personas"
  2.      COLUMN     |         TYPE          | Modifiers
  3. ----------------+-----------------------+-----------
  4.  id             | INTEGER               | NOT NULL
  5.  nombre_persona | CHARACTER VARYING(50) |
  6.  id_empresa     | INTEGER               | NOT NULL
  7. Indexes:
  8.     "personas_pkey" PRIMARY KEY, btree (id)
  9. Foreign-KEY constraints:
  10.     "personas_id_empresa_fkey" FOREIGN KEY (id_empresa) REFERENCES empresas(id)

La tabla de empresas:

Código SQL:
Ver original
  1. TABLE "public.empresas"
  2.      COLUMN     |         TYPE          | Modifiers
  3. ----------------+-----------------------+-----------
  4.  id             | INTEGER               | NOT NULL
  5.  nombre_empresa | CHARACTER VARYING(50) |
  6. Indexes:
  7.     "empresas_pkey" PRIMARY KEY, btree (id)
  8. Referenced BY:
  9.     TABLE "personas" CONSTRAINT "personas_id_empresa_fkey" FOREIGN KEY (id_empresa) REFERENCES empresas(id)

La tabla resultante del JOIN (ya viene referenciado el trigger):
Código SQL:
Ver original
  1. TABLE "public.ver"
  2.      COLUMN     |         TYPE          | Modifiers
  3. ----------------+-----------------------+-----------
  4.  nombre_persona | CHARACTER VARYING(50) |
  5.  nombre_empresa | CHARACTER VARYING(50) |
  6. Triggers:
  7.     act BEFORE UPDATE ON ver FOR EACH ROW EXECUTE PROCEDURE "MiTrigger"()

La función :
Código SQL:
Ver original
  1. SOURCE code         |
  2.                     | BEGIN                  
  3.                     | UPDATE empresas SET nombre_empresa=NEW.nombre_empresa WHERE nombre_empresa=OLD.nombre_empresa;
  4.                     | RETURN NEW;
  5.                     | END;

Y bueno, hasta aquí la cosa funciona. Si cambio un nombre de empresa en la tabla "ver", se cambia en "empresas". Si siguiera por este camino entiendo que debería de hacer otro trigger que actualizase en sentido contrario empresas->ver.

Pero parece que no es el método. Aún siendo pesado....¿cómo puedo interpretar la última parte de la sentencia que me pusiste?
O abusando del todo...como se adaptaría esa sentencias a mis tablas "persona", "empleado" y "ver".

Gracias y disculpa que sea tan pesado. :|
__________________
Mi calculadora en Qt
  #8 (permalink)  
Antiguo 16/05/2015, 04:33
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: Actualizar datos desde una tabla resultado de JOIN

Cita:
Iniciado por iislas Ver Mensaje
Kritik

¿Con que valor estas actualizando la columna_B?

En el script que nos muestras
Con lo que hay después de =

Actualiza de MiTablaA la columna_B donde coincida que (Condiciones) = valor;

Ese valor puede ser el resultado de una select de la siguiente manera:

Actualiza de MiTablaA la columna_B donde coincida que (Condiciones) = Selecciona la Columna_Z de MiTablaB donde coincida que (Condiciones);

Última edición por Kritik; 16/05/2015 a las 04:38
  #9 (permalink)  
Antiguo 16/05/2015, 10:10
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Actualizar datos desde una tabla resultado de JOIN

A ver si me aclaro, que llevo horas dándome cabezazos contra la pared:

Lo primero...puede ser que en el esquema que me has puesto falte un AS? (después de Unamas)

Código SQL:
Ver original
  1. UPDATE tabla SET columna(s) = x.valor, columna(s) = y.valor
  2.     FROM
  3.     TuOtraTabla AS x JOIN Unamas y ON x.id = y.id

y sería:

Código SQL:
Ver original
  1. UPDATE tabla SET columna(s) = x.valor, columna(s) = y.valor
  2.     FROM
  3.     TuOtraTabla AS x JOIN Unamas AS y ON x.id = y.id

Pero intento concretarla en este caso:

Tengo una TablaA (id,nombreA, id_TablaB) y una TablaB (id,nombreB)
Tengo una TablaC(nombre A,nombreB) que es el resultado de un JOIN de las anteriores.

Y ahora, si quiero que al modificar el nombreB de la TablaC, se modifique el nombreB de la TablaB, sin triggers, hago:

Código SQL:
Ver original
  1. UPDATE TablaC SET nombreB = x.nombreB FROM TablaB AS x JOIN TablaA? AS y ON x.id=y.id

La verdad es que no entiendo la lógica de la órden. De hecho ni siquiera sé dónde he de definir el nuevo valor.
__________________
Mi calculadora en Qt
  #10 (permalink)  
Antiguo 16/05/2015, 10:36
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Actualizar datos desde una tabla resultado de JOIN

Bueno, definitivamente creo que hay un malentendido.

Se supone que el trigger sirve para preservar la integridad de los datos, por eso cuando cambio modifico un valor en una tabla, de alguna manera he de preocuparme que si ese valor está referenciado a otra, también se cambie en la otra.

Releo mi duda original, y creo que no esta bien enunciada. No es que quiera usar un trigger para cambiar de forma manual un valor en la tabla origen (ni se podría hacer), sino que quiero que al cambiar un valor en la tabla "join" este valor quede actualizado en la tabla origen.
__________________
Mi calculadora en Qt

Última edición por dehm; 16/05/2015 a las 15:00
  #11 (permalink)  
Antiguo 20/05/2015, 01:53
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Actualizar datos desde una tabla resultado de JOIN

Bueno, al final he hecho esto:
Parto de 3 tablas, una de ellas producto de un JOIN de las otras dos:

Personas:

Código SQL:
Ver original
  1. CREATE TABLE personas
  2. (
  3.   id INTEGER NOT NULL,
  4.   nombre_persona CHARACTER VARYING(50),
  5.   id_empresa INTEGER NOT NULL,
  6.   CONSTRAINT personas_pkey PRIMARY KEY (id),
  7.   CONSTRAINT personas_id_empresa_fkey FOREIGN KEY (id_empresa)
  8.       REFERENCES empresas (id) MATCH SIMPLE
  9.       ON UPDATE NO ACTION ON DELETE NO ACTION
  10. )
  11. WITH (
  12.   OIDS=FALSE
  13. );

Empresas:

Código SQL:
Ver original
  1. CREATE TABLE empresas
  2. (
  3.   id INTEGER NOT NULL,
  4.   nombre_empresa CHARACTER VARYING(50),
  5.   CONSTRAINT empresas_pkey PRIMARY KEY (id)
  6. )
  7. WITH (
  8.   OIDS=FALSE
  9. );

Y la tabla resultante del JOIN (con los triggers):
Código SQL:
Ver original
  1. CREATE TABLE ver
  2. (
  3.   nombre_persona CHARACTER VARYING(50),
  4.   nombre_empresa CHARACTER VARYING(50)
  5. )
  6. WITH (
  7.   OIDS=FALSE
  8. );
  9. ALTER TABLE ver
  10.   OWNER TO david;
  11.  
  12. -- Trigger: ActEmpresas on ver
  13.  
  14. -- DROP TRIGGER "ActEmpresas" ON ver;
  15.  
  16. CREATE TRIGGER "ActEmpresas"
  17.   AFTER UPDATE
  18.   ON ver
  19.   FOR EACH ROW
  20.   EXECUTE PROCEDURE "ActualizaEmpresa"();
  21.  
  22. -- Trigger: ActPersonas on ver
  23.  
  24. -- DROP TRIGGER "ActPersonas" ON ver;
  25.  
  26. CREATE TRIGGER "ActPersonas"
  27.   AFTER UPDATE
  28.   ON ver
  29.   FOR EACH ROW
  30.   EXECUTE PROCEDURE "ActualizaNombre"();
  31.  
  32. -- Trigger: CambiaEmpresa on ver
  33.  
  34. -- DROP TRIGGER "CambiaEmpresa" ON ver;
  35.  
  36. CREATE TRIGGER "CambiaEmpresa"
  37.   BEFORE UPDATE
  38.   ON ver
  39.   FOR EACH ROW
  40.   EXECUTE PROCEDURE "CambiarEmpresa"();

Y las funciones:
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION "ActualizaEmpresa"()
  2.   RETURNS TRIGGER AS
  3. $BODY$
  4. BEGIN
  5. raise notice '(%)',NEW.nombre_empresa;
  6. raise notice '(%)',OLD.nombre_empresa;
  7. IF NOT EXISTS (SELECT empresas.nombre_empresa FROM empresas
  8.             WHERE empresas.nombre_empresa=NEW.nombre_empresa) THEN
  9. UPDATE empresas SET nombre_empresa=NEW.nombre_empresa
  10.     WHERE nombre_empresa=OLD.nombre_empresa;
  11. END IF;
  12. RETURN NEW;
  13. END;
  14. $BODY$
  15.   LANGUAGE plpgsql VOLATILE
  16.   COST 100;
  17. ALTER FUNCTION "ActualizaEmpresa"()
  18.   OWNER TO david;

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION "ActualizaNombre"()
  2.   RETURNS TRIGGER AS
  3. $BODY$
  4. BEGIN
  5. IF NOT EXISTS (SELECT personas.nombre_persona FROM personas
  6.             WHERE personas.nombre_persona=NEW.nombre_persona) THEN
  7. raise notice 'Actualizando';
  8. UPDATE personas SET nombre_persona=NEW.nombre_persona
  9.     WHERE nombre_persona=OLD.nombre_persona;
  10. END IF;
  11. RETURN NEW;
  12. END;$BODY$
  13.   LANGUAGE plpgsql VOLATILE
  14.   COST 100;
  15. ALTER FUNCTION "ActualizaNombre"()
  16.   OWNER TO david;

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION "CambiarEmpresa"()
  2.   RETURNS TRIGGER AS
  3. $BODY$
  4. BEGIN
  5. IF EXISTS (SELECT empresas.nombre_empresa FROM empresas
  6.             WHERE empresas.nombre_empresa=NEW.nombre_empresa) THEN
  7. raise notice 'Cambiando la empresa del trabajador';
  8. UPDATE personas SET id_empresa= (SELECT id FROM empresas WHERE empresas.nombre_empresa = NEW.nombre_empresa)
  9.     WHERE nombre_persona=OLD.nombre_persona;
  10.     ELSE
  11.     raise notice 'No existe la empresa!!!';
  12. END IF;
  13. RETURN NEW;
  14. END;
  15. $BODY$
  16.   LANGUAGE plpgsql VOLATILE
  17.   COST 100;
  18. ALTER FUNCTION "CambiarEmpresa"()
  19.   OWNER TO david;

De esta forma garantizo que cambiando datos en la tabla "ver" estos se actualizan de forma automática en la tabla origen.

P.D.: Dicho lo cual......todo esto no me sirve para nada porque QGIS puede trabajar con vistas, así que me puedo ahorrar el festival que había montado.

No sé si de la forma más ortodoxa, pero marco el tema como solucionado
__________________
Mi calculadora en Qt

Etiquetas: bd, join, resultado, 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 08:22.