Access中的查询(添加缺失值)

时间:2013-03-03 15:00:35

标签: sql ms-access

我有两张桌子,指南可用性指南是指南列表,可用性是一个日期列表,其中包含有关特定指南的信息。例如 03/03/14 - 指南3 - 可用 05/03/14 - 指南1 - 忙碌。如果指南在特定日期的可用性尚不清楚,那么当天根本没有可用性条目。

我想编写一个查询,在接下来的三天内返回所有指南的状态列表。如果状态未知,则会显示未知

我确信在SQL中这个任务肯定是可行的,但我不得不在Access 2013中编写Web应用程序。这意味着我必须在Access中使用查询编辑器。有经验的人可以提供一些指导吗?如果问题中有任何不明确的地方,请说出来。

Example query output:
03/03/2013 - Guide 1 - Busy
03/03/2013 - Guide 2 - Unknown
03/03/2013 - Guide 3 - Unknown
04/03/2013 - Guide 1 - Available
04/03/2013 - Guide 2 - Available
04/03/2013 - Guide 3 - Unknown
05/03/2013 - Guide 1 - Unknown
05/03/2013 - Guide 2 - Unknown
05/03/2013 - Guide 3 - Unknown

Table: Guides
Guide 1
Guide 2
Guide 3

Table: Availability
03/03/2013 - Guide 1 - Busy
04/03/2013 - Guide 1 - Available
04/03/2013 - Guide 2 - Available

P.S。:有人建议我可能需要制作第三个表,列出未来10年的所有日期。如果它有助于解决方案

,这不会是一个问题

1 个答案:

答案 0 :(得分:1)

如果您仅限于Access,则无法使用递归CTE(如果感兴趣,可以谷歌查找它们。)

因此,您必须创建一个包含所有日期的表。如果该表名为AllDates,且日期字段为Dte,则查询将如下所示(您可能需要按日期范围过滤以限制返回的行数,否则您将看到所有10年的记录):< / p>

SELECT Availability.Dte, Availability.Guide, Availability.Status
FROM Availability INNER JOIN Guides ON Availability.Guide = Guides.Guide
UNION ALL
SELECT  AllDates.Dte, Guides.Guide, 'Unknown' AS Status
FROM AllDates, Guides
WHERE NOT EXISTS (SELECT 1 FROM Availability WHERE Availability.Dte = AllDates.Dte And Availability.Guide = Guides.Guide)
ORDER BY 1, 2;

对于Web版本的Access,您需要使用2个查询。第一个(DatesGuides)将列出所有日期的所有指南,其语法非常简单:

SELECT Guides.Guide, AllDates.Dte
FROM AllDates, Guides;

第二个查询将与第一个查询LEFT JOINED。它的语法是:

SELECT DatesGuides.Dte, DatesGuides.Guide, Nz([Status],'Unknown') AS Expr1
FROM Availability RIGHT JOIN DatesGuides ON Availability.Dte = DatesGuides.Dte AND Availability.Guide = DatesGuides.Guide;