【问题标题】:Converting a cursor/while loop into a set based approach将游标/while循环转换为基于集合的方法
【发布时间】:2014-05-26 16:56:50
【问题描述】:

我对 SQL 很陌生,我正在尝试更新其中包含游标的存储过程。在此之前,我从未见过光标。游标的 select 语句有一个内连接,但只返回一列 ID。游标逐行计算每个 ID 的已删除帐户数。 存储过程结束时,将删除变量的个数插入到一张表中

我希望对游标/while 循环有更多了解的人能够提出将上述代码转换为基于集合的有效方法的最佳方法。

【问题讨论】:

    标签: sql


    【解决方案1】:

    这是一种基于集合的方式:

    ;WITH IDS AS
    (
        SELECT DISTINCT c.p_id 
        FROM dbo.deletion_h dh    
        INNER JOIN dbo.Child c 
            ON dh.C_id = c.c_id     
        WHERE CONVERT(CHAR(25),dh.delete_date,101) = @ReportDate 
        AND c.isT = 1    
        AND c.p_id NOT IN (SELECT p_id FROM dbo.Parent WHERE support = 'Y') 
    ), Data AS
    (
        SELECT  p_id,
                COUNT(*) ActiveChild,
                SUM(CASE WHEN isT = 1 AND [level] <> 'H' THEN 1 ELSE 0 END) activePk8,
                SUM(CASE WHEN isT = 1 AND [level] = 'H' THEN 1 ELSE 0 END) activeHS
        FROM dbo.child c
        WHERE [login] <> 'f'
        AND EXISTS( SELECT 1 FROM IDS 
                    WHERE p_id = c.p_id)
        GROUP BY p_id
    )
    SELECT  SUM(CASE WHEN ActiveChild > 0 THEN 1 ELSE 0 END) NumParentDeletions,
            SUM(CASE WHEN activechildPk8 > 0 THEN 1 ELSE 0 END) NumDeletionsPk8,
            SUM(CASE WHEN activeHS > 0 THEN 1 ELSE 0 END) NumDeletionsHS 
    FROM Data
    

    您可以修改最后一个 SELECT 以使其将这些值插入到您的表中。

    【讨论】:

    • @user3574076 我认为没有必要先将它们分配到变量中,然后在可以这样做时将它们插入表中:INSERT INTO YourTable SELECT SUM(.......... FROM Data
    • @user3574076 显然,您忘记在CASE 之前添加SUM
    • @user3574076 那我需要看一些数据,因为逻辑似乎和游标中使用的逻辑一样
    • @user3574076 我认为这会很困难。您可以在sqlfiddle 中发布一些示例数据,或者至少发布您的整个代码以供 sp 尝试发现差异
    猜你喜欢
    • 2015-02-16
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2014-12-11
    • 2018-02-22
    • 2017-04-26
    相关资源
    最近更新 更多