Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL优化案例语句_Sql_Sybase_Sql Optimization - Fatal编程技术网

SQL优化案例语句

SQL优化案例语句,sql,sybase,sql-optimization,Sql,Sybase,Sql Optimization,我相信我可以通过对左外部联接使用case语句来优化这个sql语句 但我一直很难设置案例,一个用于总结AB、CD代码类型,另一个用于所有其他代码类型 谢谢你在这方面给我的任何帮助或提示 update billing set payments = isnull(bd1.amount, payments) , payments = case when payments is null then 0 else payments end , charges =

我相信我可以通过对左外部联接使用case语句来优化这个sql语句

但我一直很难设置案例,一个用于总结AB、CD代码类型,另一个用于所有其他代码类型

谢谢你在这方面给我的任何帮助或提示

update billing set payments = isnull(bd1.amount, payments)
, payments = case 
       when payments is null then 0 
       else payments 
     end
, charges = case 
        when bd2.amount is not null then charges 
        when charges is null then 0 
        else charges 
      end
, balance = round(charges + isnull(bd1.amount, bi.payments), 2) 
from billing bi 

left outer join (select inv, round(sum(bd1.bal), 2) amount 
                from "bill" bd1 
                where code_type = 'AB'
                 or code_type = 'CD' 
                group by inv) bd1 
                on bd1.inv = bi.inv 
left outer join (select invoice, round(sum(bd2.bal), 2) amount 
                from "bill" bd2 
                where code_type <> 'AB'
                 and code_type <> 'CD' 
                group by inv) bd2 
                on bd2.inv = bi.inv;

也许是这样的:

update billing set payments = isnull(bd1.amount, payments)
, payments = isnull(payments, 0)
, charges = isnull(bd2.amount, isnull(charges, 0))
, balance = round(charges + isnull(bd1.amount, bi.payments), 2)
from billing bi 

left outer join (select inv, round(sum(bd1.bal), 2) amount 
                from "bill" bd1 
                where code_type in ('AB', 'CD')
                group by inv) bd1 
                on bd1.inv = bi.inv 
left outer join (select invoice, round(sum(bd2.bal), 2) amount 
                from "bill" bd2 
                where code_type not in ('AB', 'CD')
                group by inv) bd2 
                on bd2.inv = bi.inv;

两个左连接不是问题

您可以将其简化为使用单个查询而不是两个查询。您仍然需要一个,因为更新中的分组依据不起作用

UPDATE bi 
SET    payments = bd.payments, 
       charges= bd.charges, 
       balance = bd.balance 
FROM   billing bi 
       LEFT JOIN (SELECT bd.inv, 
                         payments = Round(Sum(CASE 
                                                WHEN code_type IN ( 'AB' , 'CD' ) THEN 
                                                bd.bal 
                                                ELSE 0 
                                              END), 2), 
                         charges = Round(Sum(CASE 
                                               WHEN code_type NOT IN ( 'AB' , 'CD' ) THEN 
                                               bd.bal 
                                               ELSE 0 
                                             END), 2), 
                         balance = Round(Sum(bd.bal), 2) 
                  FROM   bill bd 
                  GROUP  BY bd.inv) bd 
         ON bd.inv = bi.inv 

这有效吗?您似乎要更新“付款”列两次。这是无效的语法。你不能在集合列表中直接使用聚合函数。是的,对不起,我开始写评论,然后检查它是否100%有效,所以当我实际发布时,你已经修复了它。您可以使用CASE-WHEN-Code\u-Type IN'AB',CD'而不是Code\u-Type='AB'或Code\u-Type='CD'来进一步改进这一点。谢谢,这正是我想要的。也许我遗漏了什么,但不幸的是,我在尝试运行查询时出错。找不到预期的词汇元素:FROM在SELECT语句中的列定义后缺少关键字FROM。解析UPDATE语句中FROM关键字后的表名时出现问题Thanks@Trevor你有多余的逗号吗?@ConradFrix没有,可能是我使用的数据库管理系统有问题。我会处理的。