** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - SQL: UPDATE Condicional
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoSQL: UPDATE Condicional

 Responder Responder
Autor
Mensaje
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Tema: SQL: UPDATE Condicional
    Enviado: 30/Marzo/2020 a las 12:16
A ver si alguien me ilumina con un camino con el que no doy:

Tengo esta tabla:
TBase
Id Dato1 Dato2 Dato3 DatoExtra
1 AAA1 BBB1 CCC1 abcde1
2 AAA2 BBB2 CCC2 abcde2
3 AAA3 BBB3 CCC3 abcde3

la quiero actualizar con esta otra:
TActualizacion
Id Clave Valor Extra
1 1 NuevoA1 Ext1
2 2 NuevoB2
3 1 NuevoA3 Ext3
3 3 NuevoC3

- se relacionan por el Id
- condiciones:
   - si la clave es 1 -> Dato1 = Valor y DatoExtra = Extra
   - si la clave es 2 -> Dato2 = Valor
   - si la clave es 3 -> Dato3 = Valor

Es decir TBase actualizada debe quedar:
TBase_act
Id Dato1 Dato2 Dato3 DatoExtra
1 NuevoA1 BBB1 CCC1 Ext1
2 AAA2 NuevoB2 CCC2 abcde2
3 NuevoA3 BBB3 NuevoC3 Ext3

Ya tengo un camino resuelto con un SQL por cada campo CLAVE, pero quiero hacerlo en una sola, algo del estilo:

UPDATE (TBase LEFT JOIN TActualizacion ON TBase.Id = TActualizacion.ID)
    SET IIF(Clave=1, Dato1=Valor), IIF(Clave=2, Dato2=Valor, ......

¿Se puede hacer esto? ¿o mi neurona ya desbarra con el encierro?

Un saludo y gracias anticipadas a todos los participantes.



Editado por Mihura - 30/Marzo/2020 a las 17:19
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 30/Marzo/2020 a las 13:13
Por cierto, una solución ya probada sería:

...  SET Dato1 = IIF(Clave=1, Valor, Dato1), Dato2 =  IIF(Clave=2, Valor, Dato2) ...

pero intentaba no 'reescribir' un valor en si mismo, además de que habría que escribir un bloque IIF por cada dato, por eso intento otra cosa



Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4812
Enlace directo a este mensaje Enviado: 30/Marzo/2020 a las 19:37
Hola,

quizás sea mas fácil recorrer toda la tabla con un RecordSet y grabando los nuevos datos en una tabla temporal , luego compruebas que los datos de la tabla temporal son correctos , en caso afirmativo solo tendrías que grabarlos en la tabla original y posteriormente borrar o vaciar la tabla temporal ,..... Bueno es solo una idea .......
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 30/Marzo/2020 a las 19:48
Gracias Javier, de hecho está probada pero es más lenta que actualizar la tabla base con cinco tablas auxiliares (son cinco posibles claves) además de que las auxiliares ya están obtenidas en un paso anterior.




Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4812
Enlace directo a este mensaje Enviado: 30/Marzo/2020 a las 23:13
Entiendo ,...... y si generas un función donde contenga ese Condicional  y luego la función la embeses dentro del SQL ??? 

Ejemplo

Public Function funNullToZero(PonNumero As Variant) As Double
    On Error Resume Next

    If IsNull(PonNumero) = True Then
        funNullToZero = 0
    Else
        funNullToZero = PonNumero
    End If

End Function


SQL:

SELECT funNullToZero(Sum(funNullToZero([QUANTITY])*funNullToZero([tblSituations].[TYPENEW])*IIf([IS_CORRECT]=(-1),1,0))) AS Q_MINUS, SKINS.EAN13
FROM (SKINS LEFT JOIN qrySkinsQ_SKINS_MOVIMENTS ON SKINS.CODE_SKIN = qrySkinsQ_SKINS_MOVIMENTS.CODE_SKIN) LEFT JOIN tblSituations ON qrySkinsQ_SKINS_MOVIMENTS.CODE_SITUATION = tblSituations.CODE_SITUATION
GROUP BY SKINS.EAN13;

Es otra idea ........


Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable