Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-11-2012
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
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.

Gracias y saludos.
__________________
Confórmate con lo que tienes pero anhela lo que te falta.
Responder Con Cita
  #2  
Antiguo 21-11-2012
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 17
TOPX Va camino a la fama
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.

-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #3  
Antiguo 21-11-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #4  
Antiguo 22-11-2012
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
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.
__________________
Confórmate con lo que tienes pero anhela lo que te falta.
Responder Con Cita
  #5  
Antiguo 22-11-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por ElDioni Ver Mensaje
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
Responder Con Cita
  #6  
Antiguo 22-11-2012
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 17
TOPX Va camino a la fama
Cita:
Empezado por roman Ver Mensaje
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.

-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #7  
Antiguo 22-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pero la versión de firebird no vale, ese código sólo funcionará en un stored procedure
Responder Con Cita
  #8  
Antiguo 23-11-2012
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
En realidad lo hice adrede,

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

Saludos.
__________________
Confórmate con lo que tienes pero anhela lo que te falta.
Responder Con Cita
  #9  
Antiguo 23-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ElDioni Ver Mensaje
En realidad lo hice adrede,
Para ver si estábamos atentos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Columna en cxgrid no relacionada con tabla o consulta dunia_lv OOP 3 06-07-2010 18:31:16
Actualizar tabla con datos de otra tabla mediante UPDATE Rockin Firebird e Interbase 18 28-11-2007 19:15:42
Problema al hacer un update en una tabla con datos de otra Iseberiano SQL 3 08-06-2005 12:32:14
Update de una tabla con información de otra Manuel SQL 1 26-05-2005 20:07:38
UPDATE con referencia a otra tabla... JorgeBec SQL 6 05-08-2004 20:48:36


La franja horaria es GMT +2. Ahora son las 17:08:25.


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
Copyright 1996-2007 Club Delphi