2011-02-15 173 views
0

好了,我在这里处理4桌 -SQL语句的帮助

项目成员,迭代和ProjectIterationMembers。

当我创建新项目的详细信息,我将其写入到Project表,我也指定迭代(start dateend date - 一个项目由至少一个迭代的,但更多的迭代以后可以添加) 。从Members表成员现在写入ProjectIterationMembers表作为他们被分配到迭代。

下面的SQL语句检索所有项目,为公司 -

项目名称,则显示项目经理和项目状态。

但是,我想要做的只是显示特定成员分配给的项目。当我尝试传递MemberID时,没有检索到任何结果。

SELECT DISTINCT(Project.ProjectName), Project.ProjectID, Project.Status, 
Project.CompanyID, Project.StartDate, m.MemberID, 
m.FirstName + ' ' + m.LastName AS ProjectManager 
FROM Project, Member m, ProjectIterationMember, Iterations i WHERE 
m.CompanyRole = 'Project Manager' AND Project.CompanyID = '" + co_id + "' AND 
m.MemberID = ProjectIterationMember.MemberID AND i.ProjectIterationID = 
ProjectIterationMember.ProjectIterationID AND i.ProjectID = Project.ProjectID 
ORDER BY Project.StartDate DESC 

我的表的结构如下:

Project   Iterations    ProjectIterationMember Member 
=============== ======================== ========================= =========== 
ProjectID (PK) ProjectIterationID (PK) ProjectIterationMemberID MemberID 
CompanyID  ProjectID    ProjectIterationID  FirstName 
ProjectName  StartDate    MemberID     LastName 
StartDate  EndDate 
EndDate 
Description 
+0

请问您是通过项目会员ID是CompanyRole =“项目经理”,因为你只检索Proejct经理。 – 2011-02-15 17:24:49

+0

我要显示在该项目的项目经理的名字,但我也想只显示分配给特定成员登录项目 - 所以我需要通过MEMBERID作为一个变量。我该如何解决这个问题? – MiziaQ 2011-02-15 17:28:50

+1

你需要加入ProjectIterationMember表,然后两次,一次获得经理的名字,一次只能得到行匹配登录的用户。请上帝用连接重写,而不是用逗号分隔的表格和条件。你折磨自己和其他人有阅读此代码(如你的同事/接班人)。 – 2011-02-15 17:31:12

回答

1

我给它一个尝试...

SELECT DISTINCT 
    p.*, 
    m.MemberID, 
    m.FirstName + ' ' + m.LastName AS ProjectManager 
FROM 
    Project p 
INNER JOIN 
    Iterations i 
ON 
    p.ProjectID = i.ProjectID 
INNER JOIN 
    ProjectIterationMember pim1 
ON 
    i.ProjectIterationId = pim1.ProjectIterationID 
INNER JOIN 
    Member m 
ON 
    pim1.ProjectIterationMemberID = m.MemberID 
AND 
    m.CompanyRole = 'Project Manager' 
INNER JOIN 
    ProjectIterationMember pim2 
ON 
    i.ProjectIterationId = pim2.ProjectIterationID 
AND 
    pim2.ProjectIterationMemberID = ? 
WHERE 
    p.CompanyID = ? 
ORDER BY 
    p.StartDate DESC 
0
SELECT 
    p.ProjectName, 
    p.ProjectID, 
    p.Status, 
    p.CompanyID, 
    p.StartDate, 
    m1.MemberID, 
    m2.FirstName + ' ' + m2.LastName AS ProjectManager 
FROM 
    Project p INNER JOIN Iteration i on p.ProjectID = i.ProjectID 
    INNER JOIN ProjectIterationMember pim ON i.ProjectIterationId = pim.ProjectIterationID 
    INNER JOIN Member m1 ON pim.MemberID = m1.MemberID 
    LEFT OUTER JOIN Memember m2 ON pim.MemberID = m2.MemberID AND m2.CompanyRole = 'Project Manager' 
WHERE 
    p.CompanyID = @coId AND 
    m.MemberID = @memberId 
ORDER BY 
    Project.StartDate DESC 

这会给结果即使No PM被分配...并传递memberid和companyid作为参数。