2011-10-03 185 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之间的联结表,以允许多对多的关系。如果它是用一个联结表来设计的,那么你永远不必问这个问题。