SQL Union All для отображения старых данных с новыми данными? - PullRequest
0 голосов
/ 15 июня 2009

В 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 ]

2 голосов
/ 15 июня 2009

Да, но вы можете рассмотреть возможность создания нового запроса для объединения.

(Вам нужно будет использовать окно разработки 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.)

2 голосов
/ 15 июня 2009

Да, Access поддерживает UNION ALL. Простой пример будет:

select foo from OldData
union all
select foo from NewData
1 голос
/ 16 июня 2009

Я бы подчеркнул комментарий @le dorfier об архивации. Большинству приложений Access с хранилищем данных Jet не требуется архивировать данные. Моя клиентка управляет биллинговой системой на 6 гаражей, которую я построил для нее в 1997-98 годах (с тех пор она была модернизирована, расширена и пересмотрена). Он включает данные за весь этот период (200-300 счетов за каждый месяц для каждого гаража) и работает так же быстро, как и тогда. Частично это связано с увеличением производительности ПК (т. Е. С таким же объемом данных и ПК периода 1997 года, это, вероятно, будет очень медленным), но все равно работает просто отлично.

Если бы скорость стала проблемой, мы, вероятно, переместили бы серверную часть в SQL Server Express. Последнее, что мы могли бы рассмотреть, - это архивирование данных.

Другой мой клиент настоял на том, чтобы архивировать свои неактивные данные, а затем мне пришлось перепрограммировать функцию ADD NEW RECORD для проверки на соответствие архиву (из-за требований приложения крайне важно, чтобы у того же человека не было новой записи создан, но вместо этого извлекается из архива). Это значительно замедлило процесс добавления новых записей. Теперь я пытаюсь убедить их «деархивировать» свои данные, потому что это на самом деле не помогло им и заставило вещи работать медленнее во время ежедневных операций.

0 голосов
/ 16 июня 2009

Два комментария, не связанные с вашим вопросом.

1) Каково назначение полей с Q1 по Q32? Я думаю, что, может быть, они могут быть каким-то образом переработаны и / или нормализованы.

2) Я не вижу причин использовать стандарты именования имен объектов. Таких как tbl, fld, frm, qry и так далее. Вы в значительной степени знаете, что это за объект по контексту в коде. Если в различных окнах контейнера базы данных это также очевидно.

Тем не менее, я в некоторой степени использую соглашения об именах переменных в своем коде VBA просто для того, чтобы сохранить их ясность.

См. Соглашения об именовании объектов Тони и Соглашения об именах таблиц и полей Тони для получения более подробной информации.

Я вполне ожидаю, что некоторые люди будут категорически не согласны с моим вторым комментарием и не одобрят мою публикацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...