2016-01-25 53 views
0

下面的查询有时会起作用。MS Access查询性能问题

通常的问题是,当我运行查询时,它不会显示超过180年的那些记录的记录数,尽管它确实显示了所有其他数据。

l_section & dim_performance_score是SharePoint 2010列表。

我想报告显示,不到90天的记录,> = 90和<期180日龄,以及> = 180天。

如果我创建五个不同的存储查询并将它们留在一起,则查询将一致地工作。但是,当我将所有SQL整合到一个存储查询中时,事情就会变得很糟糕。不承担性能问题,如果我尝试查看设计窗口中的合并查询,MS Access崩溃。这是JET的一个已知问题吗?

要维护5个或6个不同的查询来获得一个答案似乎效率低下。

是我正在做的最好的方式去获得所需的数据?

PARAMETERS [compare date] DateTime; 

SELECT 
    l_section.section, 
    [compare date] AS [As of Date], 
    total_count.[Total Records], 
    IIf([less_than_90].[<90 Days] Is Null,0,[less_than_90].[<90 Days]) AS [<90 Days], 
    IIf([greater_than_90].[>=90 & <180Days] Is Null,0,[greater_than_90].[>=90 & <180Days]) AS [>=90 & <180Days], 
    IIf([greater_than_180].[>=180 Days] Is Null,0,[greater_than_180].[>=180 Days]) AS [>=180 Days] 

FROM 
    (
     (
      (
       l_section 
       LEFT JOIN 
        (
         SELECT 
          since_modified.section, 
          Count(since_modified.section) AS [>=180 Days] 
         FROM 
          (
           SELECT 
            l_section.section, 
            IIf(dim_performance_score.[Modified] Is Null,0,DateDiff("d",dim_performance_score.[Modified],[compare date])) AS days_since_update 
           FROM 
            l_section 
           LEFT JOIN 
            dim_performance_score 
           ON 
            l_section.section = dim_performance_score.section 
          ) as since_modified 
         WHERE 
          (((since_modified.days_since_update)>=180)) 
         GROUP BY 
          since_modified.section 
        ) as greater_than_180 
       ON 
        l_section.section = greater_than_180.section 
      ) 
      LEFT JOIN 
       (
        SELECT 
         since_modified.section, 
         Count(since_modified.section) AS [<90 Days] 
        FROM 
         (
          SELECT 
           l_section.section, 
           IIf(dim_performance_score.[Modified] Is Null,0,DateDiff("d",dim_performance_score.[Modified],[compare date])) AS days_since_update 
          FROM 
           l_section 
          LEFT JOIN 
           dim_performance_score 
          ON 
           l_section.section = dim_performance_score.section 
         ) as since_modified 
        WHERE 
         (((since_modified.days_since_update)<90)) 
        GROUP BY 
         since_modified.section 
       ) as less_than_90 
      ON 
       l_section.section = less_than_90.section 
     ) 
     LEFT JOIN 
      (
       SELECT 
        since_modified.section, 
        Count(since_modified.section) AS [>=90 & <180Days] 
       FROM 
        (
         SELECT 
          l_section.section, 
          IIf(dim_performance_score.[Modified] Is Null,0,DateDiff("d",dim_performance_score.[Modified],[compare date])) AS days_since_update 
         FROM 
          l_section 
         LEFT JOIN 
          dim_performance_score 
         ON 
          l_section.section = dim_performance_score.section 
        ) as since_modified     
       WHERE 
        (((since_modified.days_since_update)>=90 
        And 
        (since_modified.days_since_update)<180)) 
       GROUP BY 
        since_modified.section 
      ) as greater_than_90 
     ON 
      l_section.section = greater_than_90.section 
    ) 
    LEFT JOIN 
     (
      SELECT 
       l_section.section, 
       Count(IIf([section] Is Null,0,[section])) AS [Total Records] 
      FROM 
       l_section 
      LEFT JOIN 
       dim_performance_score 
      ON 
       l_section.section = dim_performance_score.section 
      GROUP BY l_section.section 
     ) as total_count 
    ON 
     l_section.section = total_count.section 
ORDER BY l_section.section; 

回答

0

三重嵌套连接?这是不对的。它看起来每个连接都是(或应该是)在同一个层次上。

PARAMETERS [compare date] DateTime; 

SELECT 
    l_section.section, 
    [compare date] AS [As of Date], 
    total_count.[Total Records], 
    IIf([less_than_90].[<90 Days] Is Null,0,[less_than_90].[<90 Days]) AS [<90 Days], 
    IIf([greater_than_90].[>=90 & <180Days] Is Null,0,[greater_than_90].[>=90 & <180Days]) AS [>=90 & <180Days], 
    IIf([greater_than_180].[>=180 Days] Is Null,0,[greater_than_180].[>=180 Days]) AS [>=180 Days] 

FROM l_section 
LEFT JOIN 
    (
     SELECT 
      since_modified.section, 
      Count(since_modified.section) AS [>=180 Days] 
     FROM 
      (
       SELECT 
        l_section.section, 
        IIf(dim_performance_score.[Modified] Is Null,0,DateDiff("d",dim_performance_score.[Modified],[compare date])) AS days_since_update 
       FROM 
        l_section 
       LEFT JOIN 
        dim_performance_score 
       ON 
        l_section.section = dim_performance_score.section 
      ) as since_modified 
     WHERE 
      (((since_modified.days_since_update)>=180)) 
     GROUP BY 
      since_modified.section 
    ) as greater_than_180 
ON 
    l_section.section = greater_than_180.section 

LEFT JOIN 
    (
     SELECT 
      since_modified.section, 
      Count(since_modified.section) AS [<90 Days] 
     FROM 
      (
       SELECT 
        l_section.section, 
        IIf(dim_performance_score.[Modified] Is Null,0,DateDiff("d",dim_performance_score.[Modified],[compare date])) AS days_since_update 
       FROM 
        l_section 
       LEFT JOIN 
        dim_performance_score 
       ON 
        l_section.section = dim_performance_score.section 
      ) as since_modified 
     WHERE 
      (((since_modified.days_since_update)<90)) 
     GROUP BY 
      since_modified.section 
    ) as less_than_90 
ON 
    l_section.section = less_than_90.section 

LEFT JOIN 
    (
     SELECT 
      since_modified.section, 
      Count(since_modified.section) AS [>=90 & <180Days] 
     FROM 
      (
       SELECT 
        l_section.section, 
        IIf(dim_performance_score.[Modified] Is Null,0,DateDiff("d",dim_performance_score.[Modified],[compare date])) AS days_since_update 
       FROM 
        l_section 
       LEFT JOIN 
        dim_performance_score 
       ON 
        l_section.section = dim_performance_score.section 
      ) as since_modified     
     WHERE 
      (((since_modified.days_since_update)>=90 
      And 
      (since_modified.days_since_update)<180)) 
     GROUP BY 
      since_modified.section 
    ) as greater_than_90 
ON 
    l_section.section = greater_than_90.section 

LEFT JOIN 
    (
     SELECT 
      l_section.section, 
      Count(IIf([section] Is Null,0,[section])) AS [Total Records] 
     FROM 
      l_section 
     LEFT JOIN 
      dim_performance_score 
     ON 
      l_section.section = dim_performance_score.section 
     GROUP BY l_section.section 
    ) as total_count 
ON 
    l_section.section = total_count.section 

ORDER BY l_section.section; 
+0

语法错误(缺少运营商)JOIN( SELECT since_modified.section, 计数(since_modified.section)AS [<90天] FROM (” –

+0

我觉得每个连接是在同一水平,需要有用于转换成零l_section和空每个部分的记录。 –

+0

尝试每次添加一个部分和注释掉休息。我无法看到数据所以我只能猜测,但在结构上是我写的是健全的。所以,只有第一个“LEFT JOIN”部分尝试一下,看看会发生什么。如果这样的作品,加上下一LEFT JOIN等Ø ñ。 –

0

那么我想出了一种获得我想要的并且简单得多的方法。我张贴作为我自己的答案来显示前后。

SELECT 

     section_last_modified.section, 
     Count(section_last_modified.section) AS [Total Records], 
     Sum(IIf([days_since_modified]<90,1,0)) AS [< 90 days], 
     Sum(IIf([days_since_modified] Between 90 And 180,1,0)) AS [>=90 and <180 days], 
     Sum(IIf([days_since_modified]>=180,1,0)) AS [>=180 days] 

FROM section_last_modified 

GROUP BY section_last_modified.section; 



-----section_last_modified------- 

PARAMETERS [Compare Date] DateTime; 
SELECT 
     dim_performance_score.section, 
     DateDiff("d",dim_performance_score.[Modified],[Compare Date]) AS days_since_modified 
FROM 
     dim_performance_score 
WHERE 
     (((dim_performance_score.[Content Type])="stacker maintenance")) 
ORDER BY 
     dim_performance_score.section; 
在查询表达式l_section.section = greater_than_180.section LEFT