2016-10-17 7 views
1

나는 기존 쿼리를 수정하는 IBExpert에서 일하고 있습니다. 일반적으로이 쿼리를 실행하고 결과를 Excel로 내 보낸 다음 매크로를 실행하여 새 필드를 만듭니다. Excel에서이 단계를 제거하려고합니다.SQL을 사용하여 1 대 1 레코드 대 다수 대 다수

서로 다른 테이블에서 오는 두 개의 주요 필드가 있습니다. 프로젝트에서 오는 ProjNo와 Customers에서 오는 CustNo라고 부르 자요. 다 대 다 관계가 있습니다. 하나의 프로젝트는 여러 고객을 포함 할 수 있고 한 고객은 여러 프로젝트를 운영 할 수 있습니다. 관계를 관리하기위한 링크 테이블이 있습니다.

우리는 ProjNo가 한 번만 나타나고 CustNo는 한 번만 나타나는 이러한 값 사이에 1 : 1 상관 관계가 어디에 있는지 식별 할 수 있기를 원합니다. 저는 Case Case 진술서를 작성하려고 꽤 많은 것을 보았지만 많은 행운이 없습니다. 여기 내 최신 시도 : 나는 단지 쿼리의 본체에 PROJNO 일치하는 값을 확인 Where 절의 어떤 종류를 포함해야합니다 알고

(case when (select count(Proj.ProjNo) PCounts from Proj group by Proj.ProjNo)=1 and 
      (select count(Cust.CustNo) CCounts from Cust group by Cust.CustNo)=1 
     then "1:1" else "Multi" end) as Links 

,하지만 난 잘 모르겠어요 I 올바른 방향으로 또는 Case 내부의 SQL 문을 기본 쿼리에 어떻게 연결할지를 결정합니다.

도움 말?

답변

1

이것은 어떤 권한보다 까다 롭습니다. 3 테이블 조인을 통해 Cust와 Link에 가입 한 다음 Proj와 Link에 가입하고 그 결과에 가입하려고했습니다. 그 중 하나는 테이블 쌍 중 하나에 조인하면 다른 쌍에 대해 수행 할 필요가 없으며 마지막 테이블을 링크 된 쌍으로 링크하는 것입니다. 어떤 코드인지 혼란스럽게 생각합니다.

그래서 여기에 나와있는 3 방향 조인이 있습니다. 끝에

SELECT cnc.cust_tot, pn_link.CustNo, pn_link.ProjNo, pn_link.proj_tot 
FROM 
    (SELECT CustNo, Count(CustNo) as cust_tot 
    FROM Cust 
    GROUP BY CustNo) as cnc 
INNER JOIN 
    (SELECT a.CustNo, a.ProjNo, b.proj_tot 
    FROM 
    Link as a 
    INNER JOIN 
     (SELECT ProjNo, Count(ProgNo) as proj_tot 
     FROM Proj 
     GROUP BY ProjNo) as b 
    ON a.ProjNo = b.ProjNo) as pn_link 
ON cnc.CustNo = pn_link.CustNo 
WHERE cnc.cust_tot = 1 
and pn_link.proj_tot = 1 

난 그냥 일대일 경기를 잡을 수있는 WHERE 문이있다. 다중 일치 그냥

WHERE cnc.cust_tot > 1 
or pn_link.proj_tot > 1 

로 변경 얻으려면 그런 다음 UNION 두 쿼리는 다시 하나 개의 테이블에있는 모든를 얻을 수 있습니다. 아휴.

+0

감사합니다. 나는 그것을 맞추기 위해 약간의 수정을해야 할 것이지만, 그것이 내가 필요로하는 것을 얻어야 만하는 것처럼 보인다. – Werrf