Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/04/2018, 13:11
Avatar de Chofis
Chofis
 
Fecha de Ingreso: mayo-2013
Mensajes: 5
Antigüedad: 10 años, 11 meses
Puntos: 0
Actualizar campos de otra Tabla usando UPDATE e INNER JOIN

Buen día, tengo el siguiente problema con una consulta en SQL, tengo una pequeña base de datos, llamada tienda, la cual se compone de tres tablas

únicamente, las tablas son cliente, prodcuto y nota, nota es la tabla donde tiene las llaves foraneas y se relaciona con las dos tablas anteriores

(cliente y producto).

Este diseño de base de datos lo tengo en tres gestores diferentes, los cuales son SQL Server, PostgreSQL y Mysql Workbench.

El código de las tablas para SQL Server es el siguiente:

Código:
CREATE DATABASE tienda;

USE tienda;

CREATE TABLE producto(
	clave_producto INT IDENTITY(1,1),
	nombre_del_producto VARCHAR(20),
	precio FLOAT,
	CONSTRAINT pk_clave_producto PRIMARY KEY(clave_producto)
);

CREATE TABLE cliente(
	clave_cliente INT IDENTITY(1,1),
	nombre_cliente VARCHAR(20),
	CONSTRAINT pk_clave_cliente PRIMARY KEY(clave_cliente)
);

CREATE TABLE nota(
	folio INT IDENTITY(1,1),
	cantidad INT,
	subtotal FLOAT,
	clave_producto_1 INT,
	clave_cliente_1 INT,
	CONSTRAINT pk_folio PRIMARY KEY(folio),
	CONSTRAINT fk_clave_producto_1 FOREIGN KEY(clave_producto_1) REFERENCES producto(clave_producto),
	CONSTRAINT fk_clave_cliente_1 FOREIGN KEY(clave_cliente_1) REFERENCES cliente(clave_cliente)
);
Para el auto increment en las tablas tube que usar la función IDENTITY, ya que AUTO_INCREMENT como en Mysql no funciona en SQL Server ni en

PostgreSQL.

Este es el código para PostgreSQL

Código:
CREATE TABLE producto(
	clave_producto SERIAL,
	nombre_del_producto VARCHAR(20),
	precio FLOAT,
	CONSTRAINT pk_clave_producto PRIMARY KEY(clave_producto)
);

CREATE TABLE cliente(
	clave_cliente SERIAL,
	nombre_cliente VARCHAR(20),
	CONSTRAINT pk_clave_cliente PRIMARY KEY(clave_cliente)
);

CREATE TABLE nota(
	folio SERIAL,
	cantidad INT,
	subtotal FLOAT,
	clave_producto_1 INT,
	clave_cliente_1 INT,
	CONSTRAINT pk_folio PRIMARY KEY(folio),
	CONSTRAINT fk_clave_producto_1 FOREIGN KEY(clave_producto_1) REFERENCES producto(clave_producto),
	CONSTRAINT fk_clave_cliente_1 FOREIGN KEY(clave_cliente_1) REFERENCES cliente(clave_cliente)
);
NOTA: Lo pareceido a auto_increment en este gestor es "SERIAL"

Para MySQL es el siguiente código

Código:
CREATE DATABASE tienda;

USE tienda;

CREATE TABLE producto(
	clave_producto INT AUTO_INCREMENT,
	nombre_del_producto VARCHAR(20),
	precio FLOAT,
	CONSTRAINT pk_clave_producto PRIMARY KEY(clave_producto)
);

CREATE TABLE cliente(
	clave_cliente INT AUTO_INCREMENT,
	nombre_cliente VARCHAR(20),
	CONSTRAINT pk_clave_cliente PRIMARY KEY(clave_cliente)
);

CREATE TABLE nota(
	folio INT AUTO_INCREMENT,
	cantidad INT,
	subtotal FLOAT,
	clave_producto_1 INT,
	clave_cliente_1 INT,
	CONSTRAINT pk_folio PRIMARY KEY(folio),
	CONSTRAINT fk_clave_producto_1 FOREIGN KEY(clave_producto_1) REFERENCES producto(clave_producto),
	CONSTRAINT fk_clave_cliente_1 FOREIGN KEY(clave_cliente_1) REFERENCES cliente(clave_cliente)
);
La estructura de esta pequeña base de datos queda de la siguiente forma:



Despues de tener la estructura de las tablas, se insertan los siguientes registros para las tablas cliente, producto y nota.

Código:
INSERT INTO producto(nombre_del_producto,precio) VALUES('Refresco',15.20);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Papas',9.50);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Cacahuates',13.14);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Pastillas',24);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Chicles',12.50);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Pan',18.90);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Churritos',33.22);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Cerveza',21.50);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Huevo',32);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Jamon',48);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Maruchan',13);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Rastrillo',33.20);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Condon',70);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Tuaya',55.20);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Cotonetes',24.90);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Pasta',32.40);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Helado',16.40);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Suplemento',120.90);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Enjuague',40);
INSERT INTO producto(nombre_del_producto,precio) VALUES('Hilo',18.50);

INSERT INTO cliente(nombre_cliente) VALUES('Ariana Delgado');
INSERT INTO cliente(nombre_cliente) VALUES('Maricela Aguilar');
INSERT INTO cliente(nombre_cliente) VALUES('Edagr Corona');
INSERT INTO cliente(nombre_cliente) VALUES('Doribel Penagos');
INSERT INTO cliente(nombre_cliente) VALUES('Berenice Guerrero');

INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(8,NULL,3,4);
INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(12,NULL,12,2);
INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(18,NULL,17,1);
INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(33,NULL,9,3);
INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(12,NULL,14,1);
INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(22,NULL,8,5);
INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(11,NULL,16,2);
INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(17,NULL,18,3);
INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(21,NULL,19,5);
INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(25,NULL,15,2);
Hasta este punto podemos realizar las correspondientes consultas para visualizar los registros que se agregaron a cada una de las tablas

Código:
SELECT * FROM cliente;

SELECT * FROM producto;

SELECT * FROM nota;
En la tabla nota existe un campo llamado subtotal, el cual hasta el momento no tiene valor alguno almacenado, para obtener el resultado de este campo

en particular se requiere el uso de información de dos campos los cuales son: "cantidad y precio" los cuales se encuentran en tablas diferentes, para

llegar a la solución de este problema se recurrio a los UPDATE e Inner join, ya que nos pide que se actualice el campo subtotal de la tabla nota

usando la información de otra tabla, lo cual nos obliga a usar un join para poder hacer este puenteo de información entre tablas, la consulta que

realice fue la siguiente:

Código:
UPDATE 		nota 
SET 		subtotal = cantidad * precio 
FROM 		nota 
INNER JOIN 	producto ON producto.clave_producto = nota.clave_producto_1;
Consultamos los nuevos registros actualizados: SELEC * FROM nota y vemos en SQL Server que es un éxito la operación:



La cual me funciono de maravilla pero únicamente para SQL Server, para PostgreSQL y MySQL no funciona, use el mismo script para estos gestores y los

mensajes de error que me envia son los siguientes:

ERROR MySQL



ERROR PostgreSQL



Es aqui donde surgen los problemas, ya que este UPDATE que use para SQL Server no funciona en estos dos gestores, así que intente lo siguiente para

ver si podia multiplicar los campos de otra manera y agregarlos al compo correspondiente llamado subtotal de la tabla nota, con el siguiente scirpt:

Código:
SELECT nombre_cliente,nombre_del_producto,subtotal=cantidad*precio FROM
(
SELECT 		nombre_cliente,
			nombre_del_producto,
			cantidad,
			precio,
			subtotal 
FROM 		cliente 
INNER JOIN 	nota 		ON nota.clave_cliente_1 = cliente.clave_cliente 
INNER JOIN 	producto 	ON producto.clave_producto = nota.clave_producto_1
)AS sub;
Con esta consulta me muestra datos (La únion de los campos que se logra con los JOINS) pero en el campo subtotal no me mestra resultado alguno, los

registros de ese campo en particular se muestran vacios.

MySQL



PostgreSQL




Deseo saber cual o cuales son las maneras correctas para poder multiplicar campos de diferentes tablas usando UPDATE y los Joins, intente varias

combinaciones con subconsultas, pero ningúna me ofrece el resultado que requiero.

Espero puedan ayudarme indicandome que debo investigar para poder solucionar este problema, de antemano gracias por leer mi mensaje.