假设我有两个表。一个表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中)。
答案 0 :(得分:1)
您想要一个相关子查询:
update tbl2
set count = (select count(*) from tbl1 where tbl1.software_name = tbl2.software_name);
答案 1 :(得分:0)
不确定使用的是哪种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
您可以在此处了解有关APPLY运算符的更多信息:https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/
答案 2 :(得分:0)
您可以尝试使用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。我也将其发布为答案,因为我不希望发表评论。
希望有帮助!