这个sql的更好版本?

时间:2018-04-27 16:38:41

标签: sql

我正在尝试在查询中创建一些计数,我的代码会反复重新计算总和。是否有更好的写作方式?

if(
    ( 
       (
         select count(`t2`.`id`) 
         from `qbinvoices` `t2` 
         where  `t2`.`qbAccNumber` = `t1`.`qbAccNumber`
            and `t2`.`divisionId` = `t1`.`divisionId`
        ) > 0
    ),
    (
      select count(`t2`.`id`) 
      from `qbinvoices_view` `t2`
      where  `t2`.`qbAccNumber` = `t1`.`qbAccNumber`
         and `t2`.`monthStart` > 0
         and `t2`.`divisionId` = `t1`.`divisionId`
    ),
    (
      select count(`t2`.`id`) 
      from `qbestimatesnew_view` `t2` 
      where `t2`.`qbAccNumber` = `t1`.`qbAccNumber` 
          and `t2`.`divisionId` = `t1`.`divisionId`
    )
) AS `invoiceItemsCount`

我正在使用它:

select count(`t2`.`id`) 
from `qbinvoices` `t2` 
where  `t2`.`qbAccNumber` = `t1`.`qbAccNumber`
    and `t2`.`divisionId` = `t1`.`divisionId`

If语句中。即:if(mystatement > 0, mystatement, differentVersionOfMyStatement)

我也在视图中使用它,所以我不能使用变量。是否有任何方法可以在If语句中重复计数三次?

2 个答案:

答案 0 :(得分:2)

我将这个逻辑表达为:

(case when exists (select 1
                   from `qbinvoices` `t2` 
                   where  `t2`.`qbAccNumber` = `t1`.`qbAccNumber` and
                          `t2`.`divisionId` = `t1`.`divisionId`
                  ) 
     then (select count(`t2`.`id`) 
           from `qbinvoices_view` `t2`
           where  `t2`.`qbAccNumber` = `t1`.`qbAccNumber` and
                  `t2`.`monthStart` > 0 and
                  `t2`.`divisionId` = `t1`.`divisionId`
         )
     else (select count(`t2`.`id`) 
           from `qbestimatesnew_view` `t2` 
           where `t2`.`qbAccNumber` = `t1`.`qbAccNumber` and
                 `t2`.`divisionId` = `t1`.`divisionId`
          )
end) AS `invoiceItemsCount`

count()是用于确定是否存在记录的昂贵操作。 exists具有停在第一个匹配记录的优势。

其他两个计数来自不同的表格。

另外,我更喜欢case数据特定语法,例如if()

答案 1 :(得分:1)

不,因为代码重复相同的计数。每个现有计数都会查看不同的数据源(qbinvoices vs qbinvoices_view vs qbestimatesnew_view),但结果可能不同,因此必须在sql代码中使用所有数据。

您可以做的是将JOIN与条件聚合结合使用,以便在SELECT子句中更容易表达并且执行速度更快的方式进行汇总计划。但我们需要查看整个SQL查询,以向您展示更多内容。