此查询的最佳SQL

此查询的最佳SQL,sql,oracle,Sql,Oracle,编辑:为了使查询更简单,我们需要两个表 1账户\周期\活动 2信用卡账户 我们将从1个表中分析的五列是 帐号 活动类型CDE 循环中心 活动组代码 周期\活动\计数 需要从表2中了解的列为 帐号 循环中心 逻辑是: 在ACCOUNT_CYCLE_ACTIVITY table中,找到一行,其中ACTIVITY_TYPE_CODE='007'或'011'或'021',ACTIVITY_GROUP_CODE='R12',CYCLE_ACTIVITY_AMOUNT大于$25,CYCLE_ACTIVITY

编辑:为了使查询更简单,我们需要两个表

1账户\周期\活动

2信用卡账户

我们将从1个表中分析的五列是

帐号 活动类型CDE 循环中心 活动组代码 周期\活动\计数 需要从表2中了解的列为

帐号 循环中心 逻辑是:

在ACCOUNT_CYCLE_ACTIVITY table中,找到一行,其中ACTIVITY_TYPE_CODE='007'或'011'或'021',ACTIVITY_GROUP_CODE='R12',CYCLE_ACTIVITY_AMOUNT大于$25,CYCLE_ACTIVITY_COUNT介于1到900之间-这是我查询的第一个子句

对于我们刚才找到的行,它的CYCLE_CTR列应该等于CARD_ACCOUNT table CYCLE_CTR减1的CYCLE_CTR列值这是第二条

现在这是查询的EXIST部分 如果您找到这样一行,并且表中也没有具有相同活动类型代码和相同活动组代码的相同帐户ID的行,并且周期活动计数=1,周期计数介于第一行周期计数-6和第一行周期计数-1之间,则报告该帐户

我提出了以下问题

             SELECT *
             FROM ACCOUNT_CYCLE_ACTIVITY aca 
             inner join card_account ca on ca.account_id = aca.ACCOUNT_ID
             WHERE ACTIVITY_TYPE_CODE in('011', '021', '007') 
             and ACTIVITY_GROUP_CODE= 'R12'
             and (CYCLE_ACTIVITY_AMOUNT) > 25 
             and CYCLE_ACTIVITY_COUNT =1
             and aca.cycle_ctr = ca.cycle_ctr - 1
             and NOT EXISTS 
                        (SELECT aca2.ACCOUNT_ID
                         FROM ACCOUNT_CYCLE_ACTIVITY aca2 
                         where ca.account_id = aca2.ACCOUNT_ID
                         and aca2.ACTIVITY_TYPE_CODE=aca.activity_type_code 
                         and aca2.ACTIVITY_GROUP_CODE= aca.activity_group_code
                         and CYCLE_ACTIVITY_COUNT =1
                         and aca2.cycle_ctr between aca.cycle_ctr - 6 and aca.cycle_ctr - 1);
有关于如何更有效地编写代码以提高运行时间的IDE吗?

尝试左外连接

SELECT aca.*, ca.* 
FROM card_account ca
inner join ACCOUNT_CYCLE_ACTIVITY aca  
        on aca.account_id = ca.ACCOUNT_ID
       and aca.ACTIVITY_TYPE_CODE in ('011', '021', '007') 
       and aca.ACTIVITY_GROUP_CODE = 'R12'           
       and aca.CYCLE_ACTIVITY_COUNT = 1 
       and aca.cycle_ctr = ca.cycle_ctr - 1 
       and aca.CYCLE_ACTIVITY_AMOUNT > 25 
 left join ACCOUNT_CYCLE_ACTIVITY aca2
        on aca2.account_id           = aca.ACCOUNT_ID
       and aca2.ACTIVITY_TYPE_CODE   = aca.activity_type_code 
       and aca2.ACTIVITY_GROUP_CODE  = aca.activity_group_code
       and aca2.CYCLE_ACTIVITY_COUNT = aca.CYCLE_ACTIVITY_COUNT
       and aca2.cycle_ctr      between aca.cycle_ctr - 6 and aca.cycle_ctr - 1           
where aca2.ACCOUNT_ID is null

恐怕我不明白这些要求。发布一些简化的CREATE TABLE语句和一些INSERT语句(这些语句填充您需要的样本数据)以及预期的输出,并解释为什么样本数据中的每个帐户都包含在输出中,这可能会有所帮助。理想情况下,你甚至可以在sqlfiddle上这样做,并发布一个链接。我希望这会更好。谢谢!让我运行此程序并报告完成所需的时间。只需一个问题:本条款aca2.CYCLE\u ACTIVITY\u AMOUNT>25是否适用于aca?而不是aca2?是的,它甚至不应该在左边。非常感谢!!这似乎奏效了。很抱歉,我不能给你投票,因为我没有足够的声誉。只有一个问题,如果我们会这样做,aca2.ACCOUNT\u ID为null而不是在查询的最后一行aca2.ACCOUNT\u ID为null,会有区别吗?