2009-06-15 5 views
0

MS Access에서 날짜 범위 내에서 데이터를 표시하기 위해 일부 쿼리를 사용하는 보고서가 있습니다. 쿼리는 별칭, if, sum 및 avg 함수를 사용하고 여러 테이블을 조인하여 데이터를 가져옵니다.SQL Union All은 새 데이터로 이전 데이터를 표시합니까?

누군가가 범위를 선택하면 이전 데이터와 함께이 테이블의 새 데이터를 표시하는 데 필요한 모든 필드가있는 테이블로 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)); 
+0

코드 블록을 사용해보십시오. 서식이 유지됩니다. –

+0

나는 약간의 가독성이있는 것으로 포맷하기 위해 최선을 다했다. 나는 조인 순서의 Explicitness (Access가 심지어 당신이 지정한 정확한 방법을 존중할 것인지 아닌지 논쟁의 여지가 있는지 여부)과 WHERE 절의 모든 괄호에 대해 당혹 스럽다.하지만 괜찮아. –

+0

@lc : ACE/Jet *는 각 조인 (괄호를 제외하고)을 괄호 안에 넣으라는 요청으로 JOIN 순서를 명시하도록합니다. 그러나 옵티마이 저가 주문을 변경할 수 있다는 점에서 JOIN 주문이 보장되지 않는다는 것이 맞습니다 (ACE/Jet가 표준 SQL과 호환되지 않는 또 다른 방식이기도합니다). – onedaywhen

답변

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 같은 이름을 무엇인가.

그런 다음 기존 쿼리에 플러그를 꽂으십시오.

참고 : 많은 사람들이 실제로 아카이브 테이블을 만드는 경향이 있습니다. 즉, 주 테이블에 모든 데이터를 그대로 두는 것만으로도 차이를 실제로 측정 할 수 있습니다. (당신은 이미 그 시점에 도달했을 것이고, SQL Server보다 Access에서 더 이해할 수있을 것입니다.)

+0

네, 저는 유니온의 사용이 필요에 따라 제한되도록 설정하려고합니다. 노조는 커다란 레코드를 가지고있는 것으로 악명이 높습니다. – Praesagus

+0

"유니온에 대한 새로운 querydef를 작성하는 것을 고려해 볼 수 있습니다 ... 마지막으로"- 실제로 쿼리 패킷을 DAO 객체로 검사 했으므로 SQL 디자인 창을 사용해야합니다. DAO 사용 :) FWIW DAO의 querydef는 ACE/Jet의 VIEW 또는 PROCEDURE에 매핑됩니다. 즉, DAO를 사용하면 세분성 (granularity)이 손실됩니다. – onedaywhen

+0

@le dorfier : 범위에 하나의 테이블 만 있기 때문에 테이블 이름을 사용하여 열을 한정 할 필요가 없습니다. 실제로 'FROM tblATraining'행을 추가 할 때가 있습니다. :) Ditto tblATrainingArchive. – onedaywhen

2

예, 액세스 UNION ALL을 지원

여기에 예를 들어 "오래된"쿼리입니다. 간단한 예제는 다음과 같습니다.

select foo from OldData 
union all 
select foo from NewData 
1

@le dorfier의 아카이브에 대한 의견을 강조합니다. Jet 데이터 저장소가있는 대부분의 Access 응용 프로그램은 데이터를 보관할 필요가 없습니다. 내 고객은 내가 1997-98 년에 다시 건축 한 6 개의 주차 차고에 대한 청구 시스템을 운영합니다 (그 이후로 광범위하게 업그레이드되고 확장되고 개정되었습니다). 이 기간에는 해당 기간 전체에 대한 데이터 (각 차고 당 매월 200-300 송장)가 포함되어 있으며 그 당시와 마찬가지로 지금은 빠르게 작동합니다. 그 중 일부는 PC 성능의 향상입니다 (즉, 동일한 양의 데이터 및 1997 년 PC의 경우 매우 느릴 수 있음). 그러나 여전히 정상적으로 작동합니다.

속도가 문제가되면 우리는 아마 백 엔드를 SQL Server Express로 옮길 것입니다. 우리가 고려해야 할 마지막 사항은 데이터를 보관하는 것입니다.

또 다른 클라이언트는 비활성 데이터를 보관해야한다고 주장하고 앱에 대한 요구 사항 때문에 아카이브에 대해 확인하기 위해 ADD NEW RECORD 기능을 다시 프로그래밍해야했습니다. 동일한 사람이 새로운 레코드가 생성되었지만 대신 아카이브에서 검색해야 함). 이것은 새로운 기록을 추가하는 과정을 크게 저해했습니다. 이제는 데이터를 "아카이브 해제"하도록 설득하려고합니다. 실제로 어떤 방식으로도 도움을주지 않았기 때문에 일일 작업 중에 작업 속도가 느려지 게되었습니다.

0

2 개의 의견은 귀하의 질문과 관련이 없습니다.

1) Q1 - Q32 필드의 목적은 무엇입니까? 나는 어쩌면 그것들이 어떻게 든 재 설계되거나 표준화 될 수 있다고 생각하고있다.

2) 개체 이름에 명명 표준을 사용할 이유가 없습니다. tbl, fld, frm, qry 등.코드의 컨텍스트에 따라 어떤 종류의 객체인지 거의 알 수 있습니다. 다양한 데이터베이스 컨테이너 창에서 꽤 명확한 경우에도 마찬가지입니다.

그건 분명히 내 VBA 코드에서 변수 이름 지정 규칙을 사용하여 명확하게 유지한다고 말했습니다.

자세한 내용은 Tony's Object Naming ConventionsTony's Table and Field Naming Conventions을 참조하십시오.

나는 몇몇 사람들이 내 두 번째 의견에 격렬히 동의하고 내 게시물을 엄지 손가락으로 뽑을 것을 기대합니다.

+0

tbl, fld, frm, qry에 대해서, 나는 tbl과 qry를 제외하고는 그것들 모두를 얻지 못했습니다. Access는 tabledef와 querydefs를 하나의 네임 스페이스로 나타내므로, 나는이 둘을 구별 할 수 있어야한다. 즉, 내가 만들지 않은 기존 앱을 완전히 새로 고치면서 실제 MyTable을 대신하는 tblMyTable이라는 검색어를 생성합니다. 그것은 질의이지만 테이블과 같은 이름이지만, 이것은 UI를 재 작성하고 백엔드를 재구성하여 새로운 표준을 세울 수없는 기간 동안 완전히 일시적인 것입니다. –

관련 문제