[英]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.