Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Crear una sentencia para update. (https://www.clubdelphi.com/foros/showthread.php?t=81162)

Adrian Murua 17-10-2012 07:52:09

Crear una sentencia para update.
 
Estimados Amigos:

Tengo la siguiente situacion :
Una Tabla MySQL, con la siguiente estructura:


Código SQL [-]
afiliadoscontrol( innoDB)
---------
id  int autonumeric,  (PK)
codigo varchar (25),
principal tinyint ,  
afiliados_id int,     (FK)  -> tabla afiliados.

Esta tabla forma parte de una base de datos del sistema administrativo de una Mutual, y contiene los codigos de control de las cuentas (internas de la mutual) de cada afiliado, en la mayoria de los casos cada afiliado tiene solo una cuenta o codigo de control, pero ultimamente tambien pueden tener mas de una cuenta o codigo de control, por medio de este codigo se le cobra la cuota societaria, hice referencia a que ultimamente pueden tener mas de un codigo, por lo que tuve que agregar un campo a la tabla ( principal ) para usar solo uno de los codigos para efectuar el cobro y de esta manera no cobrarle de nuevo la cuota al afiliado.

Por politica se tomo el primer codigo ingresado, como el que se usa para efectuar el cobro de la cuota, es decir que el campo principal tendria un valor de "1", para ese codigo y "0", para los restantes.

Mi problema es como actualizar el campo principal de toda la tabla para reflejar lo antes dicho. considerando que la tabla ya tiene datos ingresados.

Por Ejemplo:

Código SQL [-]
tabla afiliadoscontrol. ( como se encuentra actualmente )
---------------------

id   codigo   principal  afiliados_id

1  62542474         0  123
2  62548725         0  123


tabla afiliadoscontrol. ( como deberia quedar luego de la actualizacion )
---------------------

id   codigo   principal  afiliados_id

1  62542474         1  123
2  62548725         0  123
Como podria actualizar la tabla con una sentencia SQL, considerando que no podria hacerlo uno por uno ya que son aprox. 3000 registros.

desde ya muchas gracias.

Young 17-10-2012 16:29:47

Hola, intenta con esta sentencia, la verdad no trabajo con Mysql pero supongo que soporta el standard.

Código SQL [-]
update afiliadoscontrol
set afiliadoscontrol.principal = 1
where afiliadoscontrol.id = 1;

Saludos.

MartinS 17-10-2012 18:01:44

Hola: Muy bien no entiendo el problema pero si lo que necesitas es hacerlo solo una vez puedes hacerlo a través de un bucle, por ejemplo un Query (Le pongo Afiliados) que contenga

Código SQL [-]
Select Afiliados_id,Min(Id) as indice from AfiliadosControl
Group by Afiliados_Id

Esto te evitada mostrara solo el "menor" en id y sin duplicados ya que estas agrupando los afiliados, luego:

Código Delphi [-]
With TuComponenteSql do
Begin
   Close;
   Sql.Clear;
   Sql.Add('Uptade AfiliadosControl');
   Sql.Add('Set');
   Sql.Add('Principal = 1');
   Sql.Add('Where Id = :Codigo');
   While not Afiliados.Eof d
   Begin
       ParamByName('Codigo').AsInteger := Afiliandos.FieldByName('Indice').Asinteger;
       ExecQuery;
       Afiliados.Next;
   end;
end;


Nota: Nuevamente no se si lo haces una sola vez y ya o lo deseas hacer seguido, es decir, que es parte del sistema que lo haga habitualmente. En ese caso deberias probar algo como esto donde el bloque select muestra aquellos que se estan repitiendo pero no lo he probado y lo arme medio de memoria y por aproximacion :p

Código SQL [-]
Update afiliadosControl
Set
 Principal = 1
Where Id <> (Select id,Afiliados_id from AfiliadosControl a1
inner join AfiliadosControl a2
on a1.afiliados_id = a2.afiliados_id 
and a1.id < a2.id)



(Obviamente mucho no entiendo el problemilla)



Saludos

Adrian Murua 18-10-2012 04:16:27

Hola a todos , gracias por responder.
con respecto a la respuesta de Young.

Código SQL [-]
update afiliadoscontrol
set afiliadoscontrol.principal = 1
where afiliadoscontrol.id = 1;

El ejemplo que puse , hacia referencia a que un afiliado podia tener dos o mas codigos de control, por lo tanto si tenia dos codigos , el primer codigo ingresado en el sistema ( que corresponderia al valor menor del campo id ) deberia tener "1" en su campo "principal", y el segundo codigo , o los otros, si tiene mas de dos , tendrian un "0" en el campo principal. tu sugerencia seria correcta si solo existiera solamente un afiliado en la empresa y tuviera dos codigos de controles. En la clausula Where afiliadoscontrol_id tendria que ser igual al Min(de todos los ID de los codigos de control del usuario en cuestion). Es decir si el usuario tiene dos codigos , seria el menor de los dos, si tiene 4 seria el menor de los cuatro y asi en mas. Lo pude de esa forma pues eso es lo que no se como expresarlo en SQL. Gracias por tu respuesta.

Con respecto a la respuesta de MartinS.

Lo necesito hacer solo una vez, pues seria "acomodar" los datos ingresados ( los codigos ) del afiliado antes de haber agregado el campo "principal" a la tabla afiliadoscontrol, voy a probar usar la combinacion Delphi-MySQL, y despues te cuento. Gracias por tu respuesta.

olbeup 18-10-2012 08:51:05

Que tal esto:
Código SQL [-]
UPDATE AfiliadosControl
  SET
    PRINCIPAL = 1
  WHERE ID IN
    (
      SELECT
          MIN(ID)
        FROM AfiliadosControl
        GROUP BY AFILIADOS_ID
    )

Un saludo

MartinS 18-10-2012 13:58:42

Hola Olbeup: Tienes toda la razon. No sabia que se podia agrupar por un campo que no estuviera explicito en el select. Algo nuevo aprendido ^\||/

Saludos.-

Young 18-10-2012 16:23:44

Cita:

Empezado por MartinS (Mensaje 447388)
Hola Olbeup: Tienes toda la razon. No sabia que se podia agrupar por un campo que no estuviera explicito en el select. Algo nuevo aprendido ^\||/

Saludos.-

Me parece que esa sentencia no está del todo correcta, primero por que no hay una limitación a un id específico, por lo tanto obtendras el minimo id pero de quien?... y por lo que entiendo el campo de agrupación debe estar en el select.

Saludos.

MartinS 18-10-2012 16:44:11

Cita:

Empezado por Young (Mensaje 447396)
... por lo tanto obtendras el minimo id pero de quien?... y por lo que entiendo el campo de agrupación debe estar en el select.

Saludos.

La sentencia expuesta por Olbeup agrupa los campos por el Afiliado_Id y toma el menor de los id. En el ejemplo de Adrian lo que necesita es poner un 1 solo a un registro de cada afiliado:
Asi lo tiene él:

Código:

Id  XXX  Principal  Afiliado_Id
1              0              123
2              0              123
3              0              123
4              0              124
5              0              126
6              0              125
7              0              126
8              0              125
9              0              125

lo que desea es agregar el uno pero a un solo registro no a todos. Por lo tanto con la sentencia el resultado del select es

Código:

ID
1
4
5
6

Es decir agrupados mostrando el menor de los indices (y una sola columna). Luego con la sentencia Update actualiza y pone el uno a los id mostrados (1,4,5,6) Resultando

Código:

Id  XXX  Principal  Afiliado_Id
1              1              123
2              0              123
3              0              123
4              1              124
5              1              126
6              1              125
7              0              126
8              0              125
9              0              125

Yo tambien primero hice las prueba con el campo Afiliados_id dentro del select pero el resultado si bien era el mismo, mostraba el grupo pero con dos columnas, es decir

Código:

ID      Afiliado_ID
1          123
4          124
5          126
6          125

Por eso sugeri que hiciera un bucle ya que la sentencia del Where id in... requiere una sola columna y yo listo dos.-

Saludos

olbeup 19-10-2012 08:38:16

Cita:

Empezado por MartinS (Mensaje 447388)
Hola Olbeup: Tienes toda la razon. No sabia que se podia agrupar por un campo que no estuviera explicito en el select. Algo nuevo aprendido ^\||/

Saludos.-

Gracias MartinS ;), con tu ejemplo pude sacar la SQL, creo que nuestro compañero, Young no sabe que se puede hacer cosas muy grandes en poco código. :D

Con el ejemplo muy bien explicado, espero que lo haya entendido Young, creo que la sentencia SQL que he escrito, no lo has probado. :confused:

Un saludo.

P.D.: Repasa SQL Young :)


La franja horaria es GMT +2. Ahora son las 14:33:47.

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