2016-07-22 2 views
1

Microsoft Access 2010에서 도움이되는 도움이 필요합니다. 모든 ID와 영문 이름을 가진 마스터 테이블과 ID 및 이름이있는 7 개의 하위 테이블이 다른 언어로있는 상황이 있습니다. 주의해야 할 점은 7 개의 서브 테이블의 합으로부터 총 항목 수가 마스터 테이블과 일치하지 않을 수 있다는 것입니다. 그것은 더 적을 수도 있습니다.MS Access 2010에서 Nz()를 사용하여 중첩 제한?

ID를 표시하고 의 이름을 외국어로 표시하려고하거나 해당 이름이없는 경우 영어 이름을 표시하려고합니다.

처음에는 COALESCE를 사용하고 싶었지만 MS Access에서 지원하지 않는다는 것을 깨달았습니다.

나는 두 개의 서로 다른 접근 방식을 촬영했습니다 - 첫 번째 내부 조인되는 :

M.SID, A.ForeignName 
FROM Master M INNER JOIN Class_A A ON M.SID = A.SID 

UNION M.SID, A.ForeignName 
FROM Master M INNER JOIN Class_B B ON M.SID = B.SID 

UNION M.SID, A.ForeignName 
FROM Master M INNER JOIN Class_C C ON M.SID = C.SID 
... 

하지만 마스터의 모든 기록을 캡처 할 수 없습니다 및 중 하나에 존재하지 않는 모든 레코드를 선택하는 방법을 생각할 수 없다 클래스 A, B, C 등 그래서 내가 대신)의 Nz를 (사용하려고하기로 결정

SELECT M.SID, 
Nz(
    (SELECT ForeignName FROM Class_A A WHERE M.SID = A.SID), 
    Nz(
    (SELECT ForeignName FROM Class_B B WHERE M.SID = B.SID), 
    Nz(
     (SELECT ForeignName FROM Class_C C WHERE M.SID = C.SID), 
     EnglishName 
    ) 
    ) 
) 

FROM Master M 

그것은 클래스 B에 너무 오래 나는 중지로 완벽하게 작동하지만, 넘어가는 오류가 발생합니다

At most one record can be returned by this subquery.

또한 SWITCH를 사용하려고했지만 서브 쿼리를 지원하지 않는 것 같습니다.

+0

기대하는 값으로 개별적으로 쿼리를 실행하는 경우 둘 이상의 값을 반환하는 쿼리가 있습니까? 'Nz'는 반환 된'ForeignName'이 단지 하나의 행이나 NULL을 반환하는 경우에만 작동합니다. – Ash

+0

'IsNull'과 함께 중첩 된'IIF'를 사용할 수 없습니까? @AshwinNair와 마찬가지로, 표 C에 중복 값이 ​​있거나 Nz가 "C"subselect를 가져 와서 "B"에 추가합니다. – Jeroen

답변

2

Class_A, Class_B 또는 Class_C에 같은 SID를 가진 행이 여러 개 있기 때문에 문제가 발생했습니다. 특정 SID의 경우 Master, Class_AClass_B에는 레코드가없고 Class_C에는 2 개의 레코드가있는 상황을 생각해보십시오. 이 경우 MS Access는이 두 레코드에 대해 ForeignName 중 어떤 레코드를 사용할 지 결정합니다.

실행 다음 쿼리 :

select M.SID, count(A.SID) 
from Master M inner join Class_A A on M.SID=A.SID 
group by M.SID having count(A.SID)>1 

그런 다음 동일한 Class_B 다음 Class_C으로 위의 질의에 Class_A를 대체 할. 세 가지 쿼리 중 하나라도 반환하면 동일한 SID의 여러 레코드가있는이 세 테이블 중 하나의 SID를 가리키고 있습니다. 문제의 행 중 하나를 제외하고 모두 삭제하기 전까지는 원래 쿼리가 작동하지 않습니다.

SELECT M.SID, 
Nz(A.ForeignName, 
    Nz(B.ForeignName, 
     Nz(C.ForeignName, EnglishName) 
    ) 
) 
FROM (((Master M left outer join Class_A A on M.SID=A.SID) 
left outer join Class_B B on M.SID=B.SID) 
left outer join Class_C C on M.SID=C.SID) 

왼쪽 외부는에 해당 기록이없는 왼쪽 테이블의 레코드를 허용 조인 쿼리를보다 효율적이고 쉽게 읽을 수 있도록하기 위해 다음과 같이 또한

, 내가 조인 사용에 충실 것 오른쪽 테이블.

+0

나는 마침내 귀하의 질의로 인해 중복 된 항목을 발견했습니다! 처음에는 "SID"필드를 가져 오는 동안 기본 키로 설정했기 때문에 아무 것도 없다고 생각했지만 그 단계에서 내가 망쳐 놓은 것처럼 보입니다.나는 LEAD OUTER JOIN이 필요하다면, 단지 NZ가 이미 커버하지 않았을 때부터 "FROM MASTER"를 사용하는 대신에 궁금 할 것입니다. –

+0

도움이 된 것을 기쁘게 생각합니다. 검색어와 상관없이을 (를) 필요로합니다. 왼쪽 외부 조인 대신 내부 조인을 사용하면 쿼리는 master 및 class_a에 공통적 인 행만 반환합니다. 또한 마스터에만있는 행과 다른 테이블에없는 행을 다시 가져 오는 요구 사항이 충족되지 않습니다. – Ash