TSQL while循环

Moh*_*awi 2 t-sql sql-server loops sum sql-update

UPDATE Houses 
SET    lStatus = U.codesum
FROM   Houses H
JOIN   (SELECT ref, SUM(code) AS codesum
    FROM   Users
    GROUP  BY ref) AS U ON U.ref = H.ref
Run Code Online (Sandbox Code Playgroud)

以上代码获取每个房屋的所有用户(Houses表).为所有用户汇总代码列(Users表).最后更新house表的lstatus列中的结果.

我的问题是:我需要重写查询,而不是对代码列求和.相反,我想创建案例陈述.例如:

tempvar = 0    //local variable might be required

For each user {

If code == 1 then tempvar += 5

else if code == 2 then tempvar += 10

etc

tempvar = 0;
}
Run Code Online (Sandbox Code Playgroud)

一旦我们遍历每个房屋的所有用户,我们现在可以设置lStatus = tempvar.然后应该将tempvar重置为0以用于下一个房屋.

Tim*_*ner 5

在编写SQL时,应该尽量避免循环和其他过程构造.关系数据库不能轻易地优化这些事物,并且它们通常比它们的声明性对应物慢几个数量级.在这种情况下,SUM(code)CASE你描述的语句替换你似乎很简单:

UPDATE Houses 
SET    lStatus = U.codesum
FROM   Houses H
JOIN   (SELECT ref, SUM(CASE code WHEN 1 THEN 5 WHEN 2 THEN 10 ELSE 0 END) AS codesum
    FROM   Users
    GROUP  BY ref) AS U ON U.ref = H.ref
Run Code Online (Sandbox Code Playgroud)

通过这种方式,SUM仍然可以处理您想象的临时变量将要执行的任务.

此外,如果您有很多案例,您可能会考虑将这些案例放在一个表格中,然后只需加入即可获得总和.这可能更好维护.我在这里使用表变量,但它可能如下所示:

DECLARE @codes TABLE (
    code INT NOT NULL PRIMARY KEY,
    value INT NOT NULL
)
INSERT INTO @codes SELECT 1, 5
INSERT INTO @codes SELECT 2, 10

UPDATE Houses 
SET    lStatus = U.codesum
FROM   Houses H
JOIN   (SELECT a.ref, SUM(b.value) AS codesum
    FROM   Users a
    JOIN   @codes b on a.code = b.code -- Here we get the values dynamically
    GROUP  BY a.ref) AS U ON U.ref = H.ref
Run Code Online (Sandbox Code Playgroud)