【问题标题】:SQL Server Update from group by来自分组的 SQL Server 更新
【发布时间】:2018-01-17 15:09:03
【问题描述】:

我需要根据另一个表中的字段计数来更新临时表的列。我尝试使用以下查询来执行此操作,但出现语法错误。

我应该如何编写这个查询?

谢谢!

UPDATE #ResultadosTest
SET PalletsReservados = COUNT(pe.paen_numero)
FROM #ResultadosTest RT, dba.spro_palletencab pe
WHERE pe.pate_tempor = RT.pate_tempor
  AND pe.expo_codigo = RT.expo_codigo
  AND pe.WeekLinId = RT.WeekLinId
  AND pe.plde_codigo = RT.plde_codigo
  AND pe.paen_estado = 1 
  AND ISNULL(pe.LoteCargaId, 0) <> 0 
  AND ISNULL(pe.PREMOPID, 0) <> 0 
GROUP BY 
    pe.pate_tempor, pe.expo_codigo, pe.WeekLinId, pe.plde_codigo

错误是:

第 10 行,关键字“GROUP”附近的语法错误 (42000,156)

【问题讨论】:

  • 您应该做的第一件事是将隐式连接替换为显式连接。第二件事是显示完整的错误信息,最好标记它指向的行。

标签: sql sql-server


【解决方案1】:

您不能在更新语句中直接使用聚合函数。相反,您可以使用派生表

Update #ResultadosTest
SET PalletsReservados = ppp.countpaen_numero
From (Select Count(pe.paen_numero) as countpaen_numero ,pe.pate_tempor,spro_palletencab,........
FROM #ResultadosTest RT,dba.spro_palletencab pe
Where pe.pate_tempor=RT.pate_tempor
AND pe.expo_codigo=RT.expo_codigo
AND pe.WeekLinId=RT.WeekLinId
AND pe.plde_codigo=RT.plde_codigo
AND pe.paen_estado=1 AND IsNull(pe.LoteCargaId,0)<>0 AND     IsNull(pe.PREMOPID,0)<>0 
GROUP BY pe.pate_tempor,pe.expo_codigo,pe.WeekLinId,pe.plde_codigo ) ppp
Where ppp.pate_tempor = Field.. 

【讨论】:

    【解决方案2】:

    先组,然后加入

    Update #ResultadosTest
    SET PalletsReservados = pe.Cnt
    FROM #ResultadosTest RT
    JOIN (
        SELECT pate_tempor, expo_codigo, WeekLinId, plde_codigo, Count(pe.paen_numero) cnt
        FROM dba.spro_palletencab pe
        WHERE paen_estado=1 AND IsNull(LoteCargaId,0)<>0 AND IsNull(PREMOPID,0)<>0
        GROUP BY pate_tempor,expo_codigo,WeekLinId,plde_codigo
    ) pe ON pe.pate_tempor=RT.pate_tempor
    AND pe.expo_codigo=RT.expo_codigo
    AND pe.WeekLinId=RT.WeekLinId
    AND pe.plde_codigo=RT.plde_codigo;
    

    【讨论】:

    • 谢谢,它起作用了,但是 JOIN(Select...) 变得太慢了。最后我创建了一个临时表,然后对整个表使用 JOIN。它的速度要快得多。
    【解决方案3】:

    应该像这样工作:

        UPDATE RT
           SET PalletsReservados = pe.ctr
          FROM #ResultadosTest RT
    INNER JOIN 
             (
                SELECT pate_tempor
                      ,expo_codigo
                      ,WeekLinId
                      ,plde_codigo
                      ,Count(pe.paen_numero) as ctr
                  FROM dba.spro_palletencab 
                 WHERE paen_estado            = 1
                   AND ISNULL(LoteCargaId,0) <> 0
                   AND ISNULL(PREMOPID,0)    <> 0 
                 GROUP BY pe.pate_tempor
                         ,pe.expo_codigo
                         ,pe.WeekLinId
                         ,pe.plde_codigo               
             ) pe
            ON pe.pate_tempor   = RT.pate_tempor
           AND pe.expo_codigo   = RT.expo_codigo
           AND pe.WeekLinId     = RT.WeekLinId
           AND pe.plde_codigo   = RT.plde_codigo
    

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多