簡體   English   中英

MS Access查詢性能問題

[英]MS Access Query Performance Issue

有時以下查詢有效。

當我運行查詢時,通常的問題是它不顯示所有超過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;

三重嵌套的聯接? 那是不對的。 看起來每個聯接處於(或應該)處於同一級別。

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;

好吧,我想出了一種獲取我想要的東西的不同方法,它要簡單得多。 我發布自己的答案以顯示之前和之后。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM