Хранимая процедура для подсчета количества вхождений значения в другой столбец

#sql #sql-server #stored-procedures #count #sql-update

#sql #sql-сервер #хранимые процедуры #подсчет #sql-обновление

Вопрос:

Я хотел бы, благодаря хранимой процедуре, подсчитать в test_paternite количество вхождений «родительского» в столбец «cb» (изображение 1). Например, родительский «ASPIELEC 01 1/1» появляется 1 раз в столбце cb: (изображение 2)

изображение 1

SELECT cb, parent, test_paternite FROM [database].[dbo].[Paternite] where cb='ASPIELEC 01 1/1'

изображение 2

ожидаемые результаты для ASPIELEC 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
  

Это лучший способ?

Комментарии:

1. Пожалуйста, пожалуйста, пожалуйста, используйте форматированный текст для данных *, а не изображения — они грязные, их трудно читать, и их невозможно скопировать и вставить для людей, желающих помочь. Кроме того, определите best? Обеспечивает ли ваше текущее решение требуемые результаты? Так что вы надеетесь улучшить?

2. Спасибо за ваши советы, я пока не знаю, как правильно использовать stackoverflow

3. Тем не менее, я проголосовал за правильные ответы на другие вопросы, которые я задал

4. @jess.r Но голосование — это не то же самое, что «отметить ответ». И через 6 месяцев после того, как вы начали использовать SO, «незнание» — это просто плохое оправдание.

Ответ №1:

Если я правильно вас понял, вы могли бы упростить это как прямой коррелированный подзапрос:

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

Комментарии:

1. Спасибо, результаты соответствуют ожидаемым (как и в моем запросе), но мой запрос затрагивает только 1620 строк, в то время как ваш затрагивает все строки таблицы, почему?