【问题标题】:Update Table by Join and Group by通过加入和分组更新表
【发布时间】:2012-10-07 07:58:05
【问题描述】:

一家公司有许多评论,这些评论本身都有评级栏。

CompID  Ratig
12  3
13  3
17  4
22  4
23  5
24  3
28  3,2

这是我需要为每个公司设置的 id。 现在公司栏中的评级为 NULL

我写过这样的东西:

UPDATE Companies c
JOIN Reviews r on c.CompanyID = r.CompanyID
SET c.Rating = AVG(r.rating)
group by r.CompanyID

【问题讨论】:

标签: sql-server-2008 tsql join group-by


【解决方案1】:

这应该使用简单的嵌套查询来完成您想要的操作,在这种情况下可能比 JOIN 更简单。

UPDATE Companies
SET Rating =
  (SELECT AVG(Rating) 
   FROM Ratings
   WHERE Companies.CompanyId = Ratings.CompId)

简单的 SQLfiddle 演示 here.

编辑:如果您真的想要使用JOIN/UPDATE FROM,它看起来像这样;

UPDATE c
SET c.Rating = r.Rating
FROM Companies c
JOIN (SELECT AVG(Rating) Rating, CompID FROM Ratings GROUP BY CompId) r
  ON c.CompanyId = r.CompId

至少对我来说,阅读起来有点复杂,而且它只适用于 SQL Server,但here's the SQLfiddle 也适用于它 :)

【讨论】:

  • 我知道这行得通。可以简短地向我解释为什么它更简单,以及使用 group by & join 会如何
【解决方案2】:
 UPDATE ComisionesxColaboradorxLineaPrescripciones
 SET CANTIDAD_PRODUCTOS_CORE_CUMPLE = CANTIDAD
 FROM @ComisionesxColaboradorxLineaPrescripciones ComisionesxColaboradorxLineaPrescripciones
 INNER JOIN
    (SELECT TAB_L.COD_COLAB AS COD_COLAB,TAB_L.TIPO_COLABORADOR AS TIPO_COLABORADOR, COUNT(TAB_P.COD_SEG) AS CANTIDAD
    FROM @ComisionesxColaboradorxLineaPrescripciones TAB_L
    INNER JOIN @ComisionesxColaboradorxLineaxProductoPrescripciones TAB_P
    ON TAB_L.COD_COLAB=TAB_P.COD_COLAB AND
    TAB_L.TIPO_COLABORADOR=TAB_P.TIPO_COLABORADOR
    GROUP BY TAB_L.COD_COLAB,TAB_L.TIPO_COLABORADOR
    ) AGRUPADO 
        ON ComisionesxColaboradorxLineaPrescripciones.COD_COLAB = AGRUPADO.COD_COLAB AND
        ComisionesxColaboradorxLineaPrescripciones.TIPO_COLABORADOR = AGRUPADO.TIPO_COLABORADOR

【讨论】:

  • omg,这是我见过的最丑的 SQL 对象命名。无论如何,您的陈述与公认解决方案中的第二个陈述相同。
猜你喜欢
  • 2018-05-02
  • 2012-10-18
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多