Sql 计算值在另一列中出现次数的存储过程

Sql 计算值在另一列中出现次数的存储过程,sql,sql-server,stored-procedures,count,sql-update,Sql,Sql Server,Stored Procedures,Count,Sql Update,多亏了存储过程,我想在test_paternite中计算“cb”列中出现“parent”的次数(图1)。 例如,父级“ASPIELEC 01 1/1”在cb列中出现1次:(图2) 从[database].[dbo].[paternite]中选择cb、父项、测试父项,其中cb='ASPIELEC 01 1/1' Aspelec 01 1/1的预期结果: 我试过: USE [database] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON G

多亏了存储过程,我想在test_paternite中计算“cb”列中出现“parent”的次数(图1)。 例如,父级“ASPIELEC 01 1/1”在cb列中出现1次:(图2)

从[database].[dbo].[paternite]中选择cb、父项、测试父项,其中cb='ASPIELEC 01 1/1'

Aspelec 01 1/1的预期结果:

我试过:

USE [database]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[INS_MAJ_PATERNITE_V2] 
        @retcode int OUTPUT,
        @message VARCHAR(255) OUTPUT
    AS

BEGIN
    
            ---- how many times parents appears in cb column
    
    WITH nb_parent_dans_cb
    AS
    (
        SELECT count(*) AS nb, cb 
        FROM Paternite
        where parent in (select cb from paternite)
        GROUP BY cb 
    )

    UPDATE Paternite
    SET Test_paternite = nb_parent_dans_cb.nb
    FROM Paternite
    INNER JOIN nb_parent_dans_cb ON paternite.cb = nb_parent_dans_cb.cb

END

这是最好的方法吗?

如果我没有弄错,您可以将其简化为直接相关子查询:

update p
set test_paternite = (select count(*) from paternite p1 where p1.cb = p.parent)
from paternite p

请对数据使用格式化文本*而不是图像-它们杂乱无章,难以阅读,并且不可能复制和粘贴出来供愿意提供帮助的人使用。还有,定义最佳?您当前的解决方案是否提供了所需的结果?那么,您希望改进什么呢?谢谢您的建议,我还不知道如何正确使用StackOverflow。但是,我对我遇到的其他问题的正确答案投了赞成票asked@jess.r但投票与“给出答案”并不相同。在您开始使用SO 6个月后,“不知道”只是一个不好的借口。谢谢@DaleKThank,结果是预期的(正如我的查询),但我的查询只影响1620行,而您的查询影响表中的所有行,为什么?