SQL查询需要很长时间才能返回数据

SQL查询需要很长时间才能返回数据

问题描述:

寻找一种更好的方式来编写这个查询,我的SQL技能并不是很好,基本上真的是在寻找任何使这个更好的指针。这只是前两列,完整的报告将有更多的10。SQL查询需要很长时间才能返回数据

我正在采取一组特定的修复类型,并使用计数和计算对它们进行分析。第一项是提供到本财政年度的工作,第二项是目前收到的工作总量。

SELECT 
    "Type", 
    (
     SELECT 
      NVL (COUNT(jjo.jjobno), 0) 
     FROM 
      jjobh jjo 
     WHERE 
      jjo.jclcode = 'L' 
     AND jjo.jstatus <> '6' 
     AND jjo.year_rec <> (
      SELECT 
       sub_code 
      FROM 
       code_table 
      WHERE 
       main_code = 'YEAR' 
     ) 
     AND (
      week_comp IS NULL 
      OR year_comp = (
       SELECT 
        sub_code 
       FROM 
        code_table 
       WHERE 
        main_code = 'YEAR' 
      ) 
     ) 
     AND jjo.jrepair_type = "Type" 
    ) AS "B/F", 
    (
     SELECT 
      NVL (COUNT(jjo.jjobno), 0) 
     FROM 
      jjobh jjo 
     WHERE 
      jjo.jclcode = 'L' 
     AND jjo.jstatus <> '6' 
     AND jjo.year_rec = (
      SELECT 
       sub_code 
      FROM 
       code_table 
      WHERE 
       main_code = 'YEAR' 
     ) 
     AND jjo.jrepair_type = "Type" 
    ) AS "Recvd" 
FROM 
    (
     SELECT 
      rep.repair_type_code AS "Type" 
     FROM 
      repair_type rep 
     WHERE 
      rep.client = 'L' 
     AND rep.work_centre = '004682' 
     ORDER BY 
      rep.repair_type_code 
    ) 
ORDER BY 
    "Type"; 
+3

你可以看看的一件事是用连接替换你的许多子查询。这应该大大加快您的查询。 – Jacob 2012-07-31 10:26:50

+0

谢谢,我会看看。 – tookiebunten 2012-07-31 10:50:01

+0

表“code_table”是否有重复的条目 – shajivk 2012-07-31 11:05:38

你的代码是一团糟。我怀疑你想要的东西,如:

SELECT jjo.jrepair_type, count(*) as valbf 
FROM (SELECT coalesce(COUNT(jjo.jjobno), 0) 
     FROM jjobh jjo cross join 
      (SELECT sub_code 
      FROM code_table 
      WHERE main_code = 'YEAR' 
      ) sc 
     WHERE jjo.jclcode = 'L' AND 
      jjo.jstatus <> '6' AND 
      jjo.year_rec <> sc.sub_code AND 
      (week_comp IS NULL OR 
      year_comp = sc.sub_code 
      ) 
    ) jjo join 
    (SELECT rep.repair_type_code AS "Type" 
     FROM repair_type rep 
     WHERE rep.client = 'L' AND 
      rep.work_centre = '004682' 
    ) rtc 
    on jjo.jrepair_type = rtc.repair_type_code 
group by jjo.jrepair_type; 

它看起来像你想加入“jjo”表“修复类型代码”表,生产约每修复类型的信息。子查询中的顺序是无用的。

我的建议是将“jjo”表移动到外部的“from”。您还应该将WHERE子句移到最外面的WHERE子句中(我没有这样做)。我还没有弄清楚日期逻辑,但是这可能会让你走上正轨。

+0

戈登是的,这是正确的_“它看起来像你想加入”jjo“表”修复键入代码“表,生成关于每种修复类型的信息”_我会随着您的建议一起去,并让您知道。我现在开始意识到我的SQL技能有多弱。谢谢 – tookiebunten 2012-07-31 14:50:53