2011-10-03 189 views
1

我有一個表中的SiteUser列表,另一個表中有不同類型的記錄所有者(ID)的列。例如,SiteUsers表中的SiteUserID將用於填充表中的SalesRepID,StaffingManagerID和RecruiterID。當然,對於填充表中的每個值,SiteUserID都是不同的。如何使用SQL使用INNER JOIN從表中使用多個ID?

我想爲填充表中的每個ID列返回SiteUser的名稱。 如何正確構建JOIN語句來完成此操作?

我猜這是通過INNER JOIN完成的,但我不確定。

我當前的select語句已經有一個INNER JOIN,因爲我從另一個表中取出FillType的名字。我在一個asp.net應用程序中使用它。

enter image description here enter image description here enter image description here

我不知道這甚至有可能。任何幫助表示讚賞。

回答

4

由於每個在Fills表中的ID的允許空,你可能想LEFT JOINSiteUsers表所示:

SELECT f.FillID, s1.SiteUserLastName 'SalesRep', s2.SiteUserLastName 'StaffingManager', s3.SiteUserLastName 'Recruiter' 
FROM Fills f 
LEFT JOIN SiteUsers s1 on f.SalesRepID = s1.SiteUserID 
LEFT JOIN SiteUsers s2 on f.StaffingManagerID = s2.SiteUserID  
LEFT JOIN SiteUsers s3 on f.RecruiterID = s3.SiteUserID 
1

你將不得不多次,一個加入填充表與SiteUsers表中您想要的SiteUser名填充每個xxxID列,並使用如下的工會合並結果:

select a.SiteUserId, a.SiteUserFirstName, a.SiteUserLastName 
     from dbo.SiteUsers a 
     inner join dbo.Fills b on b.SalesRepId = a.SiteUserId 
    UNION 
select a.SiteUserId, a.SiteUserFirstName, a.SiteUserLastName 
     from dbo.SiteUsers a 
     inner join dbo.Fills b on b.StaffingManagerId = a.SiteUserId 
    UNION 
select a.SiteUserId, a.SiteUserFirstName, a.SiteUserLastName 
     from dbo.SiteUsers a 
     inner join dbo.Fills b on b.RecruiterId = a.SiteUserId 
+0

完全無法區分各種類型(SR,SM,招聘人員) – Wil

+0

的結果達成一致。我提供的SQL可能不適合用途,但我試圖解決的概念是,您必須多次加入才能獲取每個Id的名稱。 –

+0

我遲到了,但檢查我的答案...沒有多個連接需要:) – Wil

2

您可以隨時UNPIVOT結果像這樣:

SELECT 
DISTINCT 
    unpvt.FillID 
    ,unpvt.RepID 
    ,unpvt.RepType 
    ,s.SiteUserFirstName 
    ,s.SiteUserLastName 
FROM 
    (SELECT 
     FillID 
     ,SalesRepID 
     ,StaffingManagerID 
     ,RecruiterID 
    FROM Fills 
    ) f 
     UNPIVOT 
    (RepID FOR RepType IN 
    (SalesRepID, StaffingManagerID,RecruiterID) 
    ) AS unpvt 
     JOIN SiteUsers AS s on unpvt.RepID = s.SiteUserID` 

顯然,您可以使用精確的輸出(例如用CASE語句或其他類型替代RepType的不同值。

我的問題是:爲什麼貧窮的設計? Fills表中沒有三個ID,您應該有一個SiteUsersFills之間的聯結表,以允許多對多的關係。如果它是用一個聯結表來設計的,那麼你永遠不必問這個問題。