SQL使用另一个表中的计数更新多行

SQL使用另一个表中的计数更新多行,sql,count,sql-update,teradata-aster,Sql,Count,Sql Update,Teradata Aster,假设我有两张桌子。一个表tbl1是“长”的且未聚合。结构如下: Software_Name: Word PowerPoint PowerPoint Excel Word PowerPoint 在第二个表tbl2中,我想总结第一个表中的数据,即软件计数。第二个表的结构如下: Software_Name: Count: Word 2 PowerPoint 3 Excel 1 我试过: update tbl

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

Software_Name:
Word
PowerPoint
PowerPoint
Excel
Word
PowerPoint
在第二个表tbl2中,我想总结第一个表中的数据,即软件计数。第二个表的结构如下:

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中,除非您希望 自联接(在这种情况下,它必须在fromlist中显示别名)


您需要一个相关子查询:

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

不确定您使用的是什么DBMS,但在SQL Server中,我建议使用以下示例进行交叉应用

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

您可以在此处阅读有关应用运算符的更多信息:

您可以按如下方式尝试使用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。另外,我把它作为一个答案发布,因为我没有想要的声誉来评论


希望有帮助

你的where在你的groupby之后…我不知道dbms允许什么…但是把它放在groupby之前应该像这个解决方案一样解决itI。不幸的是,我得到了一个列名不存在的错误,尽管该列在表中。有任何关于为什么会发生这种情况的见解吗?@Daniel。一定是拼错了什么的。不幸的是,看起来不像是拼错了。如果有什么不同的话,我正在使用Aster。我找不到任何关于这个错误的文档。