MS Access 2010中的日期字段的联合查询

时间:2018-03-15 14:53:39

标签: sql ms-access ms-access-2010

我在数据表 TableofDates 中包含三个字段的条目; ProjectID(type = dbText),Start(type = dbDate)和Finish(type = dbDate):

TableofDates

override func viewWillAppear(_ animated: Bool) {
    let indices = self.tableView.indexPathsForVisibleRows ?? []
    for index in indices {
       guard let cell = self.tableView.cellForRow(index) else { continue }
       cell.textLabel?.text = textDataArray[index.row]
    }

    super.viewWillAppear(animated)
}

我希望提供以下数据集,其中包含各个DateA记录(派生自[TableofDates]中的[Start])和DateB记录(派生自[TableofDates]中的[Finish])

ToD UNION

ProjectID   Start       Finish  
ABC         01/01/2018  09/09/2018

以下SQL Query几乎产生了所需的结果:

ProjectID   DateA       DateB
ABC         01/01/2018  
ABC                     09/09/2018

我遇到的问题是插入的空字符串强制字段数据键入dbText。

如果我插入Nulls,我只会复制第一个日期字段:

SELECT ProjectID,DateA, '' AS DateB
FROM DtA
UNION SELECT ProjectID, '' AS DateA,DateB
FROM DtB;

的产率:

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;

如何根据需要创建TableofDates联合并插入“Null”日期,并在结果数据集中维护dbDate的数据类型?

2 个答案:

答案 0 :(得分:2)

您可以使用标题行(返回0条记录的select语句,但包含正确的类型和标签)

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无法确定字段类型,并选择了错误的字段。

通过使用不返回记录的查询,但明确设置字段类型,您可以避免该问题。

请注意,从UNION(进行类型转换和检查重复项)到UNION ALL(不做这些事情)的更改也解决了问题。所以2个解决方案的价格是一个。

答案 1 :(得分:0)

Union查询将忽略除第一个SELECT语句中的字段别名以外的字段别名。

NULL值小于任何日期值,因此降序排序将首先放置NULLS。

此SQL生成示例输出:

SELECT              ProjectID, Start AS DateA, NULL AS DateB
FROM                TableOfDates

UNION ALL SELECT    ProjectID, NULL, Finish
FROM                TableOfDates
ORDER BY            ProjectID, DateA DESC  

此表:

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
相关问题