SQL优化案例语句
我相信我可以通过对左外部联接使用case语句来优化这个sql语句 但我一直很难设置案例,一个用于总结AB、CD代码类型,另一个用于所有其他代码类型 谢谢你在这方面给我的任何帮助或提示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 =
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没有,可能是我使用的数据库管理系统有问题。我会处理的。