2013-12-13 56 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
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