繁体   English   中英

优化查询 - select 语句以防万一

[英]Optimize Query - select statement in case when

我正在尝试比较两组交易。 一个来自商店日志,另一个来自会计记录。 我有一个 with 语句创建一个表来比较两个事务并包含任何不匹配的事务。 该表称为“比较”

现在我想弄清楚为什么某些值可能不存在于比较中,所以我添加了一个 case when 语句。 这是我到目前为止所拥有的

select distinct *, 
case
   when (store_trans_id is not null and acctng_trans_id is not null) then 'Match'
   when (acctng_trans_id is null) then
      case 
        when exists (select 1 from compare cc where c.store_trans_id = cc.store_trans_id 
                                              and c.store_amount = cc.store_amount * -1) 
        then 'Store item transaction reversed'
      end
   else 'Research further'
end as 'Comparison'
from compare c

因此,当我只有第一种情况(匹配)时,我的查询运行速度很快。 当我添加第二个时,它变慢了。 本质上,我要检查的是是否存在收银员发出的商店交易然后取消的交易。 如果是这样,那么金额将相同,恰好相反($5 与 -$5)并且商店交易 ID 将相同。 我不希望会计记录中出现逆向交易,因为该商品尚未离开商店。 关于如何优化查询运行时间的任何想法? 我已经添加了附加案例并从 is not null 移动到 when exists 语句。

这当然没有经过测试——假设我正在试一试,但你必须让我知道它是如何工作的。

主要思想:去掉相关子查询,改用 sum/group by。

应该有 3 个案例可能涵盖也可能不涵盖所有案例(我想他们应该但是你可以通过将我的内部连接更改为左连接来测试该理论并查看左侧是否有 null 个结果)。

显然,索引可能会有很大帮助。 比如store_trans_id上的索引(包括accting_trans_id和store_amount)

我不知道表中有什么(如果)主键所以在我有c.PK <> c2.PK的查询中这意味着表中的主键 - 尽管在这种情况下标准可能可以也被省略,因为总和仍然会出现 0 或非零,这就是我们所关心的。

select c.*, c2.[Comparison]
from compare c
inner /* left */ join
(
    -- case 1: acctg_trans_id is not null
    select 
        store_trans_id,
        'Match' as [Comparison]
    from compare c
    where 
        store_trans_id is not null 
        and acctng_trans_id is not null
    union all
    -- case 2: acctg_trans_id is null and two store amounts sum to 0
    select 
        c.store_trans_id,
        'Store item transaction reversed' as [Comparison]
    from 
        compare c
        inner join compare c2
        on c.store_trans_id = c2.store_trans_id
        and c.PK <> c2.PK
    where 
        c.acctng_trans_id is null
        having sum(c.store_amount) = 0
    union all
    -- case 3: acctg_trans_id is null and two store amounts do not sum to 0
    select 
        c.store_trans_id,
        'Research further' as [Comparison]
    from 
        compare c
        inner join compare c2
        on c.store_trans_id = c2.store_trans_id
        and c.PK <> c2.PK
    where 
        c.acctng_trans_id is null
    having 
        sum(c.store_amount) <> 0
) c2
on c.store_trans_id = c2.store_trans_id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM