2013-07-16 42 views
1

嗨加入后我有一个UNION beetween到看起来像这样的表:创建SELECT和UNION

SELECT GetStudentClassmates.AvatarFileName as AvatarFileName, 
     GetStudentClassmates.UserName  as UserName, 
     GetStudentClassmates.RoleId   as RoleId 
FROM GetStudentClassmates 
WHERE GetStudentClassmates.StudentId = @studentId 

UNION 

SELECT GetStudentTeachers.AvatarFileName as AvatarFileName, 
     GetStudentTeachers.UserName   as UserName, 
     GetStudentTeachers.RoleId   as RoleId 
FROM GetStudentTeachers 

现在我需要加入工会的结果与其他表,并添加另一列最终的结果。

这是JOIN代码我使用

LEFT OUTER JOIN Sync_StudentAssignments as StudentAssignments 
    ON @studentId = StudentAssignments.StudentID 
    AND StudentAssignments.Deletion_Date IS NULL 
LEFT OUTER JOIN Sync_StudentAssignmentInstances as StudentAssignmentInstances 
    ON StudentAssignments.StudentAssignmentID = StudentAssignmentInstances.StudentAssignmentID 
    AND StudentAssignmentInstances.Deletion_Date IS NULL 

我的问题是,我不知道我要补充的选择代码,这将是这个样子,我认为:

SELECT StudentAssignmentInstances.ModuleInstanceId 

我最后的表应该有以下栏目:

AvatarFileName, 
UserName, 
RoleId, 
ModuleInstanceId 

我怎样才能做到这一点?

+0

什么是工会和两个连接之间的关系表? –

+0

你的联盟意味着:_让我一个学生和所有在同一记录集中的老师_;那真的是你想要的吗? – OzrenTkalcecKrznaric

+0

是的,我得到的数据将被用在同一个地方,角色ID将用来区分不同的角色 – aleczandru

回答

2

在SQL Server如果你想与一些工会,您可以使用子查询的形式或CTE加入。 这里,因为它在T-SQL代码添加了一些订单,我会用CTE ...

;WITH Participants AS (
    SELECT GetStudentClassmates.AvatarFileName as AvatarFileName, 
     GetStudentClassmates.UserName  as UserName, 
     GetStudentClassmates.RoleId   as RoleId 
    FROM GetStudentClassmates 
    WHERE GetStudentClassmates.StudentId = @studentId 

    UNION ALL 

    SELECT GetStudentTeachers.AvatarFileName as AvatarFileName, 
     GetStudentTeachers.UserName   as UserName, 
     GetStudentTeachers.RoleId   as RoleId 
    FROM GetStudentTeachers) 
SELECT 
FROM 
    Participants p 
    JOIN WhateverYouWant wyw 
    ON wyw.{column1} = p.{column1} 
    AND wyw.{column2} = p.{column2} 
    ... 

这里WhateverYouWant可能是你Sync_StudentAssignments JOIN Sync_StudentAssignmentInstances。然而,你已经加入了使用变量和常量,这将产生笛卡尔积,我相信这不是你的意图。

编辑

现在我更仔细地看着你的条件,我认为你必须做到以下几点:

;WITH Participants AS (
    SELECT GetStudentClassmates.AvatarFileName, 
     GetStudentClassmates.UserName, 
     GetStudentClassmates.RoleId, 
     GetStudentClassmates.StudentId  
    FROM GetStudentClassmates 
    --WHERE GetStudentClassmates.StudentId = @studentId 
    --uncomment previous line only if you need just one student in your recordset 

    UNION ALL 

    SELECT GetStudentTeachers.AvatarFileName, 
     GetStudentTeachers.UserName, 
     GetStudentTeachers.RoleId, 
     GetStudentClassmates.TeacherId AS StudentId -- just guessing column name 
    FROM GetStudentTeachers 
    --previous select means you need all of the teachers, no matter which student 
) 
SELECT 
    p.AvatarFileName, 
    p.UserName, 
    p.RoleId, 
    StudentAssignmentInstances.ModuleInstanceId 
FROM 
    Participants p 
    LEFT JOIN Sync_StudentAssignments as StudentAssignments 
    ON p.StudentId = StudentAssignments.StudentID 
    AND StudentAssignments.Deletion_Date IS NULL 
    LEFT JOIN Sync_StudentAssignmentInstances as StudentAssignmentInstances 
    ON StudentAssignments.StudentAssignmentID = StudentAssignmentInstances.StudentAssignmentID 
    AND StudentAssignmentInstances.Deletion_Date IS NULL 
4

环绕你UNION位在括号中,并用它作为一个在线表格,然后正常连接:

----------------------------------------------------------- 
-- choose the exact columns you need here using the aliases 
----------------------------------------------------------- 
select x.*, ssa.*, ssai.* from 
(
    select .... 
    union 
    select .... 
) as x 
inner join Sync_StudentAssignments ssa on ... 
inner join Sync_StudentAssignmentInstances ssai on .... 
1
SELECT tbl.AvartarFileName, 
     tbl.UserName, 
     tbl.RoleId, 
     StudentAssignmentInstances.ModuleInstanceId 
FROM 
(
    SELECT GetStudentClassmates.AvatarFileName as AvatarFileName, 
      GetStudentClassmates.UserName  as UserName, 
      GetStudentClassmates.RoleId   as RoleId 
     FROM GetStudentClassmates 
    WHERE GetStudentClassmates.StudentId = @studentId 

    UNION 

    SELECT GetStudentTeachers.AvatarFileName as AvatarFileName, 
      GetStudentTeachers.UserName   as UserName, 
      GetStudentTeachers.RoleId   as RoleId 
      FROM GetStudentTeachers 
) AS tbl 
LEFT OUTER JOIN Sync_StudentAssignments as StudentAssignments 
    ON @studentId = StudentAssignments.StudentID 
    AND StudentAssignments.Deletion_Date IS NULL 
LEFT OUTER JOIN Sync_StudentAssignmentInstances as StudentAssignmentInstances 
    ON StudentAssignments.StudentAssignmentID = StudentAssignmentInstances.StudentAssignmentID 
    AND StudentAssignmentInstances.Deletion_Date IS NULL