SQL Union All 用新数据显示旧数据?
题
在 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));
解决方案
是的,但是您可能会考虑为工会创建新的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。
然后,无论您在任何地方都将其插入现有查询中即可。
注意:许多人还倾向于更快地创建一个档案表 - 您可能会考虑将其全部留在主桌子中,并在您可以实际测量差异时进行拆分。 (您可能已经达到了这一点并完成了这一点;与SQL Server相比,访问权限可能更有意义。)
其他提示
是的,访问支持 UNION ALL
. 。一个简单的例子是:
select foo from OldData
union all
select foo from NewData
我会强调@le Dorfier关于存档的评论。大多数带有喷气数据存储的访问应用程序不需要存档数据。我的一位客户运营着一个我在1997 - 98年为她建造的6个停车场的计费系统(从那时起,它已被升级,扩展和修订)。它包括整个期间的数据(每个车库的每个月发票200-300个发票),现在的工作方式与当时一样快。其中一部分是PC的性能提高(即具有相同数量的数据和1997年的PC,这可能非常慢),但仍然可以正常工作。
如果速度开始成为问题,我们可能会将后端移至SQL Server Express。我们考虑的最后一件事是归档数据。
我的另一个客户坚持要存档他们的无活动数据,然后我必须对添加新的记录功能进行重新编程以检查档案(由于应用程序的要求,至关重要的是,同一个人没有创建新记录,但相反,它从档案中取回)。这大大减慢了添加新记录的过程。现在,我试图说服他们“消除”他们的数据,因为它实际上并没有以任何方式帮助他们,并且在日常操作中使事情变得更慢。
有两条评论与您的问题无关。
1) Q1 至 Q32 字段的用途是什么?我想也许这些可以以某种方式重新设计和/或标准化。
2)我认为没有理由在对象名称上使用命名标准。如tbl、fld、frm、qry等。通过代码中的上下文,您几乎可以知道它们是什么类型的对象。如果在各种数据库容器窗口中,这些也非常明显。
也就是说,我在 VBA 代码中确实使用了一些变量命名约定,只是为了帮助保持这些清晰。
看 托尼的对象命名约定 和 托尼的表和字段命名约定 更多细节。
我很希望有些人强烈反对我的第二条评论,并拒绝我的帖子。