【问题标题】:SQL Update Multiple Rows with Count from another TableSQL 使用另一个表中的计数更新多行
【发布时间】:2018-12-02 10:34:29
【问题描述】:

假设我有两张桌子。一个表 tbl1 是“长的”且非聚合的。结构如下:

Software_Name:
Word
PowerPoint
PowerPoint
Excel
Word
PowerPoint

在第二个表 tbl2 中,我想总结第一个表中的数据,即 Software 的计数。第二个表的结构如下:

Software_Name:      Count:
Word                 2
PowerPoint           3
Excel                1

我试过了:

update tbl2
set count = 
(select count(software_name)
from tbl1
group by software_name
where tbl1.software_name = tbl2.software_name)
from tbl1

我将结果插入到正确的列中,但它不是正确的值。它是所有值的总和,在本例中为 5。我包含了 where 子句,因为在我的 tbl1 中,我有更多的软件名称,而不是对 tbl2 中的计数感兴趣。

更新 我在这个项目中使用 Teradata Aster。我一直在查看 UPDATE 命令的 Aster 文档并遇到了这个问题:

UPDATE [ ONLY ] table
   SET column = expression [, ...]
   [ FROM fromlist ]
   [ WHERE condition | WHERE CURRENT OF cursor_name ];

在阅读 fromlist 时,我发现了以下信息:

请注意,目标表不得出现在 fromlist 中,除非您打算 自加入(在这种情况下,它必须与来自列表中的别名一起出现)。

【问题讨论】:

  • 您在 group by 之后的位置...我不知道 dbms 允许什么...但是将它放在 group by 之前应该可以解决它

标签: sql count sql-update teradata-aster


【解决方案1】:

您想要一个相关的子查询:

update tbl2
    set count = (select count(*) from tbl1 where tbl1.software_name = tbl2.software_name);

【讨论】:

  • 我喜欢这个解决方案。不幸的是,尽管列在表中,但我得到一个列名不存在错误。关于为什么会发生这种情况的任何见解?
  • @丹尼尔。 . .一定有拼写错误之类的。
  • 不幸的是,它看起来不像是拼写错误。如果这有所作为,我正在使用 Aster。我找不到任何有关该错误的文档。
【解决方案2】:

不确定您使用的是什么 DBMS,但在 SQL Server 中,我会推荐一个 CROSS APPLY 以及下面的示例...

update t2
set t2.[Count] = t1.[Count]
from t2
    cross apply (
                    select count(*) AS [Count]
                    from t1
                    where t1.Software_name = t2.Software_name
                ) AS t1

您可以在此处阅读有关 APPLY 运算符的更多信息:https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

【讨论】:

    【解决方案3】:

    您可以尝试如下使用 CTE:

    DECLARE @TABLE1 AS TABLE (Software_Name VARCHAR(100))
    
    INSERT INTO @TABLE1
    SELECT 'Word'
    UNION ALL
    SELECT 'PowerPoint'
    UNION ALL
    SELECT 'PowerPoint'
    UNION ALL
    SELECT 'Excel'
    UNION ALL
    SELECT 'Word'
    UNION ALL
    SELECT 'PowerPoint'
    
    
    
     DECLARE @TABLE2 AS TABLE (Software_Name VARCHAR(100),Cnt INT)
     INSERT INTO @TABLE2 (Software_Name)
     SELECT DISTINCT Software_Name FROM @TABLE1
    
    
    
     ;WITH CTE AS
     (
         SELECT 
             COUNT(T1.Software_Name) AS Cnt
             ,T1.Software_Name 
         FROM @TABLE2 T2
         INNER JOIN @TABLE1 T1 ON T1.Software_Name = T2.Software_Name
         GROUP BY
         T1.Software_Name
     )
    
    
     UPDATE T2
     SET 
     T2.Cnt =  C.Cnt
     FROM @TABLE2 T2
     INNER JOIN CTE C ON C.Software_Name = T2.Software_Name
    
     SELECT * FROM @TABLE2
    

    注意:我假设您使用的是 SQL Server。另外,我将其发布为答案,因为我不想发表评论。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 2021-09-17
      • 2019-03-12
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多