2013-12-13 4 views
1

기본 테이블을 가져 와서 여러 다른 테이블의 정보와 조인하고 원래 테이블의 행당 하나의 행을 반환하는 뷰를 만들려고합니다. 예를 들어, 내가 대학 졸업자를 취업 대학원 데이터에 맞추고 있다고 가정 해 보겠습니다. 사실, 이것이 내가하는 일이기 때문입니다. 자, 여기서 문제는 취업 및 대학원 데이터에서 여러 개의 성냥을 얻을 수 있다는 것입니다. 사람들은 한 명 이상의 고용주를 위해 일할 수도 있고, 한 대학원에 다니고 다른 한 곳으로 옮길 수도 있습니다. 이렇게하면 가입 할 때 중복 행이 만들어지며 집계 (또는 다른 방법)를 통해 제거해야합니다.다중 조인 뷰 만들기

나의 현재 솔루션은 중첩하는 것입니다 조인이 같은/쿼리 뭔가 : 이것은 말, 내가 지금보고 싶은 (더 많은 데이터에 가지고 싶어 특히, 나에게 조금 추한 것

select ID, GradYear, max(Salary) as Salary, case when sum(case when S.Year=GradYear+1 then 1 else 0 end)>0 then 1 else 0 end 
from 
(
    select ID, GradYear, sum(case when W.Year=GradYear+1 then W.Wages else null end) as Salary 
    from 
    (
     select ID, GradYear 
     from dbo.Students 
     where Graduated=1 
    ) as G 
    left join dbo.Wages as W 
    on G.ID=W.ID 
) as Inner 
left join dbo.GradSchool as S 
on Inner.ID=S.ID 

군대에서 그들을 위해). 가입을 성취 할 수있는 더 좋은 방법이 있습니까? 만약 내가 똑바로 세 테이블을 합치면, 예를 들어 2 학년 학교 기록이 있으면 사람들의 임금을 두 배로 계산하게 될 것입니다. 해결책이 있다면 알려주세요!

답변

2
SELECT 
    U.ID, 
    U.GradYear, 
    W.Salary, 
    S.HasGradSchool 
FROM dbo.Students U 
OUTER APPLY (
    SELECT 
    SUM(Wages) AS Salary 
    FROM dbo.Wages 
    WHERE ID = U.ID 
    AND Year = U.GradYear+1 
) W 
OUTER APPLY (
    SELECT TOP 1 
    1 AS HasGradSchool 
    FROM dbo.GradSchool 
    WHERE ID = U.ID 
    AND Year = U.GradYear+1 
) S 
where U.Graduated=1