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