2013-01-06 5 views
0

이 쿼리에서는 5 개의 테이블, 회사, 프로그래머, 테스터, 관리자 및 테이블 계약 테이블에서 정보를 추출합니다. 필자는 프로그래머, 테스터 및 관리자 명과 전화 번호뿐만 아니라 자신이 일하는 회사를 추출 할 것이고이 회사는 x 사람의 요청이 중요하지 않기 때문에이 프로그램을 관리 할 책임이 있습니다.중복 된 SQL 서버를 방지

문제는 아래 코드와 같습니다. 프로그래머의 이름과 전화 번호가 회사의 관리자 및 테스터의 수만큼 나올 것 같은 정보가있을 때마다 정보가 여러 번 나옵니다.

왼쪽 외부 조인을 시도했는데 결과가 더 많았습니다. 다음 번에 결과가 복제되지 않지만 NULL이라고 말하면 어떻게 수정할 수 있습니까?

SELECT DISTINCT pg.name, 
       pg.Tel_Nr, 
       Mgr.name, 
       Mgr.Tel_Nr, 
       Ts.Name, 
       Ts.Tel_Nr, 
       Pg.Name, 
       con.program_name 
FROM Company AS Cm 
INNER JOIN Programmer AS Pg ON Pg.company = Cm.name 
INNER JOIN Manager AS Mg ON Mg.company = Cm.name 
INNER JOIN Tester AS Ts ON Ts.company = Cm.name 
INNER JOIN Contract AS Con ON Con.program_name = 'My Program' 
AND Cm.name = Con.Company 
+0

어떤 테이블로 인해 문제가 발생합니까? 관리자 및 테스터? – sourcecode

+0

프로그래머와 테스터가 2 명 있다고 가정 해보십시오. 내 결과는 첫 번째 행이됩니다 : pg1, pg1_tel, mgr1, mgr1_tel, ts1, ts1.tel, cmp.name 두 번째 행 pg1에서 pg1.tel은 이전에 발견 되었기 때문에 NULL이어야합니다. ts1, ts1.tel과 동일합니다 그러면 두 번째 행이됩니다 : pg1, pg1_tel, mgr2, mgr2_tel, ts1, ts1.tel, cmp.name – Legjendat

답변

0

아마도 직장 설명과 함께 연락처 세부 정보 목록을 만드는 것이 합리적 일 것입니다. 이런 식으로 뭔가 :

WITH Cte as (select Cm.name from 
     Contract as Con join Company as Cm on Cm.name = Con.Company 
    where Con.program_name = 'My Program') 
SELECT pg.name, pg.Tel_Nr, 'Programmer' as JobTitle 
FROM Cte INNER JOIN 
    Programmer as Pg on Pg.company = Cte.name 
UNION ALL 
SELECT Mgr.name, Mgr.Tel_Nr,'Manager' as JobTitle 
FROM Cte INNER JOIN 
    Manager as Mg on Mg.company= Cte.name 
UNION ALL 
SELECT Ts.Name, Ts.Tel_Nr, 'Tester' as JobTitle 
FROM Cte INNER JOIN 
    Tester as Ts on Ts.company = Cte.name 

이 솔루션은 THR CompanyContract 테이블을 여러 번 쿼리 피하기 위해 공통 테이블 식 (Cte 표시)를 배포합니다. Find out more.

+0

그래, 그 일을했지만, 해냈다. Cte는 무엇입니까? – Legjendat

+0

이것은 공통 테이블 표현식입니다. 기본 쿼리의 여러 다른 위치에서 하나의 하위 쿼리를 다시 사용하는 방법입니다. – APC