创建多个联接的视图

时间:2013-12-13 20:11:47

标签: sql sql-server tsql left-join

我正在尝试创建一个视图,该视图采用基表并将其连接到来自多个其他表的信息,并在原始表中每行返回一行。举个例子,假设我将大学毕业生与就业和研究生院数据相匹配......因为事实上,我正在做的事情。现在,这里的问题是我可以在就业和研究生院数据中得到多个匹配。人们可以为一个以上的雇主工作,或者他们可以去一所研究生院,然后决定转学到另一所。这会在我加入时创建重复的行,然后需要通过聚合(或其他方法)来消除。

我目前的解决方案是执行类似这样的嵌套连接/查询:

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个研究生记录,我最终会重复计算人们的工资......例如,如果你有解决方案,请告诉我!

1 个答案:

答案 0 :(得分: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