【发布时间】:2014-05-26 16:56:50
【问题描述】:
我对 SQL 很陌生,我正在尝试更新其中包含游标的存储过程。在此之前,我从未见过光标。游标的 select 语句有一个内连接,但只返回一列 ID。游标逐行计算每个 ID 的已删除帐户数。 存储过程结束时,将删除变量的个数插入到一张表中
我希望对游标/while 循环有更多了解的人能够提出将上述代码转换为基于集合的有效方法的最佳方法。
【问题讨论】:
标签: sql
我对 SQL 很陌生,我正在尝试更新其中包含游标的存储过程。在此之前,我从未见过光标。游标的 select 语句有一个内连接,但只返回一列 ID。游标逐行计算每个 ID 的已删除帐户数。 存储过程结束时,将删除变量的个数插入到一张表中
我希望对游标/while 循环有更多了解的人能够提出将上述代码转换为基于集合的有效方法的最佳方法。
【问题讨论】:
标签: sql
这是一种基于集合的方式:
;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 以使其将这些值插入到您的表中。
【讨论】:
INSERT INTO YourTable SELECT SUM(.......... FROM Data
CASE 之前添加SUM