none
Subconsulta con UPDATE RRS feed

  • Pregunta

  • Buenas Noches!

    Tengo una tabla (Concurso) de ACCESS con los siguientes campos:

    Equipo  |  Total_Puntos  |  Integrantes     |   Puntos_Obtenidos

      1                                           María                      0

      1                                           Luis                       5

      1                                           Juan                      2

      2                                           Elsa                      10

      2                                           Victor                   15

      2                                           Denis                     0

    ...... (hasta un total de 3000 registros)

    Los Puntos obtenidos por cada Integrante van aumentando según los que consiguen en cada fase del concurso y necesito que cuando los actualizo se sumen el total de puntos de todos los integrantes del mismo equipo y se registren en el campo Total_Puntos, pero no se como hacerlo, es decir, para el quipo 1 debería reflejarse 7 y para el equipo 2, 25.

    He intentado lo siguiente:

    Consulta = "UPDATE Concurso As A INNER JOIN (Select SUM(Puntos_Obtenidos) as Puntos, Serie From Concurso Group By Equipo) As B  SET A.Premios = B.Puntos On A.Equipo= B.Equipo)"........................Pero me da error de sintaxis.

    Gracias.

    • Cambiado EricRR lunes, 15 de marzo de 2021 14:21 SQL
    sábado, 13 de marzo de 2021 15:51

Todas las respuestas

  • Te sale error de sintaxis porque en el INNER JOIN te falta la cláusula ON para indicar el criterio de unión, y además porque la sintaxis del UPDATE requiere que el JOIN vaya detrás del FROM (con lo que tienes que repetir la tabla dos veces).

    A mí me resulta más claro escribirlo con una subquery en lugar de con un Join. Aunque en teoría el Join se supone que s más eficiente, en la práctica el optimizador de consultas de SQL Server es lo bastante inteligente para convertir internamente la sentencia de forma que le sale el mismo plan de ejecución.

    Update Concurso as A
      set A.Total_Puntos = (
        select SUM(Puntos_Obtenidos) From Concurso As B
          where B.Equipo = A.Equipo
      )

    sábado, 13 de marzo de 2021 18:10
  • Hola Alberto. He escrito lo que me has puesto y me sale el error La operación debe usar una consulta actualizable
    sábado, 13 de marzo de 2021 22:34
  •  Si tomamos como ejemplo a todos los integrantes del equipo 1 y sumamos sus puntos obtenidos, ¿quieres que en el campo TotalPuntos a cada uno se le inserte el valor 7? si es a si, creo que esta consulta podría servirte:

    UPDATE dbo.Consurso
    SET  dbo.Consurso.Total_Puntos = (SELECT sum(c.Puntos_Obtenidos) puntosTotales FROM dbo.Consurso c WHERE c.Equipo = dbo.Consurso.Equipo)

     Ahí veras que el resultado obtenido es la sumatoria de todos los puntos.

     Lo que no veo del todo correcto es que este valor este almacenado en la misma tabla que los puntos que estamos sumando, a si como repetir esa información para cada integrante del equipo, si esto es para un reporte, creo que hacer ese sum en el query de selección posiblemente sea una mejor idea.

     Ojala te sea de utilidad


    Saludos desde Monterrey, Nuevo León, México!!!

    domingo, 14 de marzo de 2021 2:05
  • Buenos Días!

    Me sigue dando el mismo error. Lo tengo solucionado de la forma siguiente (pero creo que si consiguiera hacerlo en una instrucción única sería mucho mejor):

    'PRIMERO OBTENGO LA SUMA POR EQUIPOS Y LAS PONGO EN UN ARRAY

    Consulta = "Select SUM(Puntos_Obtenidos) As Total, Equipo From Concurso Group By Equipo"
    CmdOle = New OleDb.OleDbCommand(Consulta, Conex)
    CmdOle.CommandType = CommandType.Text
    CmdOle.ExecuteNonQuery()
    DaOle = New OleDb.OleDbDataAdapter(CmdOle)
    Dt = New DataTable
    DaOle.Fill(Dt)
    '

    If Dt.Rows.Count > 0 Then
         For i As Integer = 0 To Dt.Rows.Count - 1
               Dim row As DataRow = Dt.Rows.Item(i)
               ArrayPuntos(Convert.ToInt32(row("Equipo"))) = Convert.ToString(row("Total"))
         Next
    End If
    '
    A CONTINUACIÓN REGISTRO CADA RESULTADO (GUARDADO EN EL ARRAY)

    For i As Integer = 1 To UBound(ArrayPuntos)
          If ArrayPuntos(i) > 0 Then
               Consulta = "UPDATE Concurso SET Total_Puntos = " & ArrayPuntos(i) & " Where Equipo = " & i
               CmdOle = New OleDb.OleDbCommand(Consulta, Conex)
               CmdOle.CommandType = CommandType.Text
               CmdOle.ExecuteNonQuery()
          End If
    Next

    domingo, 14 de marzo de 2021 10:06
  • Pues yo te diria..

    ;with dos as (Select SUM(Puntos_Obtenidos) as Puntos, Equipo From Concurso Group By Equipo)

    UPDATE  A  set a.premios= b.puntos from Concurso As A INNER JOIN dos as B on A.Equipo= B.Equipo);


    jueves, 25 de marzo de 2021 18:09