Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Update a una tabla que está relacionada con otra (https://www.clubdelphi.com/foros/showthread.php?t=81517)

ElDioni 21-11-2012 18:58:41

Update a una tabla que está relacionada con otra
 
Hola,

he mirado por el foro pero no me acabo de aclarar, ya no tengo la cabeza que tenía antes, a ver si pudieran echarme una mano, pero no al cuello. Tengo la siguiente consulta en un programa:

Código SQL [-]
UPDATE productos SET AnchoPap=143 WHERE productos.ref IN (SELECT DISTINCT ref FROM troqueles WHERE principal=true AND Troquel=2298)

Esta consulta funciona, hace lo que quiero, pero tarda mucho en generar la subconsulta y actualizar los datos, ¿no habría alguna forma de hacer la consulta de actualización pero sin hacer subconsulta?.

Código SQL [-]
UPDATE productos SET AnchoPap=143 WHERE productos.ref=troqueles.ref AND troqueles.Troquel=2298 AND troqueles.principal=true

Algo así, nada más que sin que de error y que funcione. :p

Gracias y saludos.

TOPX 21-11-2012 19:43:32

Hola,

No especifica el motor de base de datos que usa, pero:

Con SQL estándar, para muchos motores, podría hacer:
Código SQL [-]
UPDATE productos 
SET AnchoPap=143 
WHERE EXISTS (
  SELECT DISTINCT 1 
  FROM troqueles 
  WHERE ref = productos.ref
  AND principal=true 
  AND Troquel=2298
)
Con Firebird, también podría hacer:
Código SQL [-]
FOR
  SELECT DISTINCT ref 
  FROM troqueles 
  WHERE principal=true 
  AND Troquel=2298
INTO :ref DO
BEGIN
  UPDATE productos 
  SET AnchoPap=143 
  WHERE ref = :ref
END

Con MS Sql, también podría hacer:
Código SQL [-]
UPDATE productos 
SET AnchoPap=143 
INNER JOIN troqueles
ON productos.ref = troqueles.ref
AND troqueles.principal=true 
AND troqueles.Troquel=2298

Con (algunas versiones de) Oracle, también podría hacer:
Código SQL [-]
UPDATE (
  SELECT productos.ref, productos.AnchoPap
  FROM productos
  INNER JOIN troqueles
  ON productos.ref = troqueles.ref
  WHERE troqueles.principal=true 
  AND troqueles.Troquel=2298
)
SET AnchoPap=143

Pero siempre, siempre, se le va a demorar ese UPDATE mientras la selección de registros de la tabla productos no esté apropiadamente indexada. Desde mi humilde opinión, es la única opción.

-

roman 21-11-2012 19:57:26

También en MySQL se puede usar el JOIN. Y concuerdo con TOPX en que sin los índices adecuados la consulta siempre será lenta.

// Saludos

ElDioni 22-11-2012 09:34:38

Hola,

gracias TOPX y roman por vuestras respuestas y tiempo, parezco nuevo, el motor de base de datos es ACCESS, he probado con el código de MS SQL

Código SQL [-]
UPDATE productos  SET 
AnchoPap=143  INNER JOIN troqueles 
ON productos.ref = troqueles.ref 
AND troqueles.principal=true  
AND troqueles.Troquel=2298

No me funcionaba, me salía error de sintaxis, así que probé con la de oracle.

Código SQL [-]
UPDATE (   
SELECT productos.ref, productos.AnchoPap   
FROM productos   INNER JOIN troqueles   
ON productos.ref = troqueles.ref   
WHERE troqueles.principal=true    
AND troqueles.Troquel=2298 ) 
SET AnchoPap=143

Con esta consulta funcionó de maravilla, además actualizó la tabla muy rápido, así que cojonudo.

Muchas gracias.

roman 22-11-2012 19:26:32

Cita:

Empezado por ElDioni (Mensaje 450140)
parezco nuevo

Je, je. Lo bueno es que TOPX aplicó la regla 5 de la otra guía de estilo:

Cita:

Si tienes un problema con bases de datos no es necesario que nos digas qué motor usas, nosotros sabemos la respuesta para cualquiera de ellos.
:)

// Saludos

TOPX 22-11-2012 19:31:43

Cita:

Empezado por roman (Mensaje 450193)
Je, je. Lo bueno es que TOPX aplicó la regla 5 de la otra guía de estilo:

Últimamente me pasa mucho, que ando adivinando desvergonzadamente; parece que estuviera estrenando bola de cristal.

Ahora, no sé si sea bueno o malo. No quiero malacostumbrar, pero tampoco dejar de ayudar si está en mis posibilidades.

-

Casimiro Notevi 22-11-2012 20:07:45

Pero la versión de firebird no vale, ese código sólo funcionará en un stored procedure :D

ElDioni 23-11-2012 10:55:54

En realidad lo hice adrede,

para que puedan repasar todos los motores de BBDD y no se apolillen sus conocimientos. :D

Saludos.

Casimiro Notevi 23-11-2012 11:57:48

Cita:

Empezado por ElDioni (Mensaje 450256)
En realidad lo hice adrede,

Para ver si estábamos atentos :p


La franja horaria es GMT +2. Ahora son las 06:12:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi