我正在尝试创建一个视图,该视图采用基表并将其连接到来自多个其他表的信息,并在原始表中每行返回一行。举个例子,假设我将大学毕业生与就业和研究生院数据相匹配......因为事实上,我正在做的事情。现在,这里的问题是我可以在就业和研究生院数据中得到多个匹配。人们可以为一个以上的雇主工作,或者他们可以去一所研究生院,然后决定转学到另一所。这会在我加入时创建重复的行,然后需要通过聚合(或其他方法)来消除。
我目前的解决方案是执行类似这样的嵌套连接/查询:
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个研究生记录,我最终会重复计算人们的工资......例如,如果你有解决方案,请告诉我!
答案 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