MS Access 2010 中日期字段的联合查询
Union Query of Date Fields in MS Access 2010
我在数据 table TableofDates 中有条目包含三个字段;项目 ID(类型 = dbText)、开始(类型 = dbDate)和完成(类型 = dbDate):
日期表
ProjectID Start Finish
ABC 01/01/2018 09/09/2018
我希望呈现以下数据集,其中包含单独的 DateA 记录(从 [TableofDates] 中的 [Start] 派生)和 DateB 记录(从 [TableofDates] 中的 [Finish] 派生)
ToD 联合
ProjectID DateA DateB
ABC 01/01/2018
ABC 09/09/2018
以下 SQL 查询几乎可以生成所需的结果:
SELECT ProjectID,DateA, '' AS DateB
FROM DtA
UNION SELECT ProjectID, '' AS DateA,DateB
FROM DtB;
我遇到的问题是插入的空字符串强制字段数据键入 dbText。
如果我改为插入空值,我只会复制第一个日期字段:
SELECT ProjectID, DateA, Null AS DateB
FROM DtA
UNION SELECT ProjectID, Null AS DateA, DateB
FROM DtB;
产量:
ToD UNION
ProjectID DateA DateB
ABC 01/01/2018
ABC
联盟的两个部分各自独立工作:
SELECT ProjectID,DateA, Null AS DateB
FROM DtA;
产量
ToD UNION
ProjectID DateA DateB
ABC 01/01/2018
同时
SELECT ProjectID,Null AS DateA, DateB
FROM DtB;
产量
ToD UNION
ProjectID DateA DateB
ABC 09/09/2018
有什么想法可以根据需要创建具有插入 "Null" 日期的 TableofDates 并集,并在结果数据集中维护 dbDate 的数据类型吗?
您可以使用 header 行(select 语句 returns 0 条记录,但包括正确的类型和标签)
SELECT CLng(1) As ProjectID, #2001-01-01# As DateA, #2001-01-01# As DateB
FROM MSysObjects
WHERE 1=0
UNION ALL
SELECT ProjectID, DateA, Null
FROM DtA
UNION ALL
SELECT ProjectID, Null, DateB
FROM DtB;
您的查询不起作用,因为在 Access 中,联合查询的第一个查询决定了字段的类型和标签。由于第一个查询的最后一列只包含 Null
,Access 无法确定字段类型,并选择了错误的。
通过使用不 return 记录但显式设置字段类型的查询,您可以避免该问题。
请注意,从 UNION
(类型转换和检查重复项)到 UNION ALL
(不执行这些操作)的更改也解决了该问题。所以 2 个解决方案的价格。
联合查询将忽略第一个 SELECT 语句中除外的字段别名。
NULL 值小于任何日期值,因此降序排序会将 NULL 放在第一位。
此 SQL 生成您的示例输出:
SELECT ProjectID, Start AS DateA, NULL AS DateB
FROM TableOfDates
UNION ALL SELECT ProjectID, NULL, Finish
FROM TableOfDates
ORDER BY ProjectID, DateA DESC
这个table:
ProjectID Start Finish
ABC 01/01/2018 09/09/2018
DEF 01/02/2017 03/05/2018
产生了这个结果:
ProjectID DateA DateB
ABC 01/01/2018
ABC 09/09/2018
DEF 01/02/2017
DEF 03/05/2018
我在数据 table TableofDates 中有条目包含三个字段;项目 ID(类型 = dbText)、开始(类型 = dbDate)和完成(类型 = dbDate):
日期表
ProjectID Start Finish
ABC 01/01/2018 09/09/2018
我希望呈现以下数据集,其中包含单独的 DateA 记录(从 [TableofDates] 中的 [Start] 派生)和 DateB 记录(从 [TableofDates] 中的 [Finish] 派生)
ToD 联合
ProjectID DateA DateB
ABC 01/01/2018
ABC 09/09/2018
以下 SQL 查询几乎可以生成所需的结果:
SELECT ProjectID,DateA, '' AS DateB
FROM DtA
UNION SELECT ProjectID, '' AS DateA,DateB
FROM DtB;
我遇到的问题是插入的空字符串强制字段数据键入 dbText。
如果我改为插入空值,我只会复制第一个日期字段:
SELECT ProjectID, DateA, Null AS DateB
FROM DtA
UNION SELECT ProjectID, Null AS DateA, DateB
FROM DtB;
产量:
ToD UNION
ProjectID DateA DateB
ABC 01/01/2018
ABC
联盟的两个部分各自独立工作:
SELECT ProjectID,DateA, Null AS DateB
FROM DtA;
产量
ToD UNION
ProjectID DateA DateB
ABC 01/01/2018
同时
SELECT ProjectID,Null AS DateA, DateB
FROM DtB;
产量
ToD UNION
ProjectID DateA DateB
ABC 09/09/2018
有什么想法可以根据需要创建具有插入 "Null" 日期的 TableofDates 并集,并在结果数据集中维护 dbDate 的数据类型吗?
您可以使用 header 行(select 语句 returns 0 条记录,但包括正确的类型和标签)
SELECT CLng(1) As ProjectID, #2001-01-01# As DateA, #2001-01-01# As DateB
FROM MSysObjects
WHERE 1=0
UNION ALL
SELECT ProjectID, DateA, Null
FROM DtA
UNION ALL
SELECT ProjectID, Null, DateB
FROM DtB;
您的查询不起作用,因为在 Access 中,联合查询的第一个查询决定了字段的类型和标签。由于第一个查询的最后一列只包含 Null
,Access 无法确定字段类型,并选择了错误的。
通过使用不 return 记录但显式设置字段类型的查询,您可以避免该问题。
请注意,从 UNION
(类型转换和检查重复项)到 UNION ALL
(不执行这些操作)的更改也解决了该问题。所以 2 个解决方案的价格。
联合查询将忽略第一个 SELECT 语句中除外的字段别名。
NULL 值小于任何日期值,因此降序排序会将 NULL 放在第一位。
此 SQL 生成您的示例输出:
SELECT ProjectID, Start AS DateA, NULL AS DateB
FROM TableOfDates
UNION ALL SELECT ProjectID, NULL, Finish
FROM TableOfDates
ORDER BY ProjectID, DateA DESC
这个table:
ProjectID Start Finish
ABC 01/01/2018 09/09/2018
DEF 01/02/2017 03/05/2018
产生了这个结果:
ProjectID DateA DateB
ABC 01/01/2018
ABC 09/09/2018
DEF 01/02/2017
DEF 03/05/2018