0

在 MS Access 中,我有一些报告使用一些查询来显示日期范围内的数据。查询使用别名、if、sum 和 avg 函数,并连接多个表以获取其数据。

我想知道我是否可以使用 UNION ALL 和一个包含所有需要字段的表来显示这个表中的这个新数据以及旧数据,如果有人选择了一个跨越新的和老的。

这是一个示例“旧”查询:

SELECT tblAssessment.fldValid, tblATraining.fldTID, tblATraining.fldTCrsID, 
tblCourses.fldCrsName, [fldCrsHrs]/8 AS Days, tblATraining.fldTLocAbr, 
tblDistrict.fldDistAbr, tblRegion.fldRegName, tblATraining.fldTDateStart, 
tblATraining.fldTDateEnd, tblATraining.fldTEnrolled, tblATraining.fldTPID, 
tblPersonnel.fldPName, tblAssessment.fldTrngSID, tblAssessment.Q1, 
IIf([fldValid]=True,IIf([Q1]>0,1,0),0) AS Q1Valid, tblAssessment.Q2, 
IIf([fldValid]=True,IIf([Q2]>0,1,0),0) AS Q2Valid, tblAssessment.Q3, 
IIf([fldValid]=True,IIf([Q3]>0,1,0),0) AS Q3Valid, tblAssessment.Q4, 
IIf([fldValid]=True,IIf([Q4]>0,1,0),0) AS Q4Valid, tblAssessment.Q5, 
IIf([fldValid]=True,IIf([Q5]>0,1,0),0) AS Q5Valid, tblAssessment.Q6, 
IIf([fldValid]=True,IIf([Q6]>0,1,0),0) AS Q6Valid, tblAssessment.Q7, 
IIf([fldValid]=True,IIf([Q7]>0,1,0),0) AS Q7Valid, tblAssessment.Q8, 
tblAssessment.Q9, 
IIf([fldValid]=True,IIf([Q9]>0,1,0),0) AS Q9Valid, tblAssessment.Q10, 
IIf([fldValid]=True,IIf([Q10]>0,1,0),0) AS Q10Valid, tblAssessment.Q11, 
IIf([fldValid]=True,IIf([Q11]>0,1,0),0) AS Q11Valid, tblAssessment.Q12, 
IIf([fldValid]=True,IIf([Q12]>0,1,0),0) AS Q12Valid, tblAssessment.Q13, 
tblAssessment.Q14, 
IIf([fldValid]=True,IIf([Q14]>0,1,0),0) AS Q14Valid, tblAssessment.Q15, 
IIf([fldValid]=True,IIf([Q15]>0,1,0),0) AS Q15Valid, tblAssessment.Q16, 
IIf([fldValid]=True,IIf([Q16]>0,1,0),0) AS Q16Valid, tblAssessment.Q17, 
IIf([fldValid]=True,IIf([Q17]>0,1,0),0) AS Q17Valid, tblAssessment.Q18, 
IIf([fldValid]=True,IIf([Q18]>0,1,0),0) AS Q18Valid, tblAssessment.Q19, 
IIf([fldValid]=True,IIf([Q19]>0,1,0),0) AS Q19Valid, tblAssessment.Q20, 
tblAssessment.Q21, 
IIf([fldValid]=True,IIf([Q21]>0,1,0),0) AS Q21Valid, tblAssessment.Q22, 
IIf([fldValid]=True,IIf([Q22]>0,1,0),0) AS Q22Valid, tblAssessment.Q23, 
IIf([fldValid]=True,IIf([Q23]>0,1,0),0) AS Q23Valid, tblAssessment.Q24, 
IIf([fldValid]=True,IIf([Q24]>0,1,0),0) AS Q24Valid, tblAssessment.Q25, 
IIf([fldValid]=True,IIf([Q25]>0,1,0),0) AS Q25Valid, tblAssessment.Q26, 
IIf([fldValid]=True,IIf([Q26]>0,1,0),0) AS Q26Valid, tblAssessment.Q27, 
IIf([fldValid]=True,IIf([Q27]>0,1,0),0) AS Q27Valid, tblAssessment.Q28, 
IIf([fldValid]=True,IIf([Q28]>0,1,0),0) AS Q28Valid, tblAssessment.Q29, 
tblAssessment.Q30, 
tblAssessment.Q31, tblAssessment.Q32
FROM ((tblDistrict 
       LEFT JOIN tblRegion ON tblDistrict.fldDRegID = tblRegion.fldRegID) 
       RIGHT JOIN (((tblATraining 
                     LEFT JOIN tblCourses ON tblATraining.fldTCrsID = tblCourses.fldCrsID) 
                   LEFT JOIN tblPersonnel ON tblATraining.fldTPID = tblPersonnel.fldPID) 
                  LEFT JOIN tblLocations ON tblATraining.fldTLocAbr = tblLocations.fldLID) ON tblDistrict.fldDistAbr = tblATraining.fldTDistAbr) 
     LEFT JOIN tblAssessment ON tblATraining.fldTID = tblAssessment.fldTrngCID
WHERE (((tblAssessment.fldValid)=True) 
        AND ((tblATraining.fldTCrsID) Like [forms]![fdlgRptCriteria].[selCrsCd]) 
        AND ((tblATraining.fldTDateStart) Between [forms]![fdlgRptCriteria].[seldate1] And [forms]![fdlgRptCriteria].[seldate2]) 
        AND ((tblAssessment.fldTrngSID) Is Not Null));
4

4 回答 4

2

是的,Access 支持UNION ALL. 一个简单的例子是:

select foo from OldData
union all
select foo from NewData
于 2009-06-15T16:11:47.313 回答
2

是的,但您可以考虑为联合创建一个新的 querydef。

(您需要使用我上次检查时的 SQL 设计窗口。)

大约是:

    SELECT
    tblATraining.fldTID,
    tblATraining.fldTCrsID,
    tblATraining.fldTLocAbr,
    tblATraining.fldTDateStart,
    tblATraining.fldTDateStart,
    tblATraining.fldTDateEnd,
    tblATraining.fldTEnrolled,
    tblATraining.fldTPID

    UNION ALL

    tblATrainingArchive.fldTID,
    tblATrainingArchive.fldTCrsID,
    tblATrainingArchive.fldTLocAbr,
    tblATrainingArchive.fldTDateStart,
    tblATrainingArchive.fldTDateStart,
    tblATrainingArchive.fldTDateEnd,
    tblATrainingArchive.fldTEnrolled,
    tblATrainingArchive.fldTPID

并将其命名为 tblATrainingUnion。

然后只需将它插入到您现有的查询中,无论您有 tblATraining。

注意:许多人还倾向于在真正有意义之前更快地创建存档表 - 您可能会考虑将其全部留在主表中,并在您可以实际衡量差异时进行拆分。(您可能已经达到了这一点并做到了这一点;使用 Access 比使用 SQL Server 更有意义。)

于 2009-06-15T16:22:00.640 回答
1

我会强调@le dorfier 关于归档的评论。大多数具有 Jet 数据存储的 Access 应用程序不需要存档数据。我的一个客户运行一个计费系统,用于我在 1997-98 年为她建造的 6 个停车场(从那时起,它已经进行了广泛的升级、扩展和修改)。它包括整个期间的数据(每个车库每个月有 200-300 张发票),它现在的工作速度和当时一样快。部分原因是 PC 性能的提高(即,对于相同数量的数据和 1997 年的 PC,它可能会很慢),但它仍然可以正常工作。

如果速度开始成为问题,我们可能会将后端移至 SQL Server Express。我们考虑的最后一件事是归档数据。

我的另一个客户坚持归档他们的非活动数据,然后我不得不重新编程 ADD NEW RECORD 功能以检查存档(由于应用程序的要求,同一个人没有创建新记录至关重要,但是而是从存档中检索)。这大大减慢了添加新记录的过程。现在我试图说服他们“解除归档”他们的数据,因为它实际上并没有以任何方式帮助他们,并且在日常操作中让事情变得更慢。

于 2009-06-15T23:50:21.207 回答
0

与您的问题无关的两条评论。

1) Q1 到 Q32 字段的用途是什么?我在想也许这些可以以某种方式重新设计和/或标准化。

2) 我认为没有理由对对象名称使用命名标准。如tbl、fld、frm、qry等。您几乎可以通过代码中的上下文知道它们是什么类型的对象。如果在各种数据库容器窗口中,这些也很明显。

也就是说,我确实在我的 VBA 代码中使用了变量命名约定,以帮助保持清晰。

有关详细信息,请参阅Tony 的对象命名约定Tony 的表和字段命名约定

我非常希望有些人强烈反对我的第二条评论并拒绝我的帖子。

于 2009-06-16T09:39:34.310 回答