0

我有 3 张桌子。A、B、C 如图所示。

Table A                | Table B                   | Table C
---------------------- | ------------------------- |--------------------------------
StudentId StudentName  |  SubjectId  SubjectName   |  StudentId   SubjectId   Marks
   1          Jack     |     101        History    |     1          101        33
   2          Peter    |     102        Science    |     2          102        75
   3          Samantha |     103        Literature |     3          101        55
----------------------- | ------------------------- | -------------------------------

我需要一个查询来针对每个主题生成结果,如下所示:-

 ------------------------------------
  StudentName  SubjectName     Marks
 ------------------------------------
   Jack         History         33
   Jack         Science         0
   Jack         Literature      0
   Peter        History         0
   Peter        Science         75
   Peter        Literature      0
   Samantha     History         33
   Samantha     Science         33
   Samantha     Literature      33
 ------------------------------------

我使用了以下未产生预期结果的查询。

    1. select  a.StudentName, b.SubjectName, c.Marks from a, b, c
       where
            a.StudentId = c.StudentId
       and  
            c.SubjectId = b.StudentId

    2.  select  a.StudentName, b.SubjectName, c.Marks from a, b, c
       where
            a.StudentId = c.StudentId
       and  
            c.SubjectId = b.StudentId(+)
    3.select  a.StudentName, b.SubjectName, c.Marks from a, b, c
       where
            a.StudentId = c.StudentId
       and  
            (+)c.SubjectId = b.StudentId

我的查询会错过分数不在表 C 中的科目。而我需要为每个学生重复表 b 中的所有三个科目。在输入的地方获得分数,如果没有针对 TableC 中的特定学生输入主题,则显示“0”。提前致谢。

4

4 回答 4

2

这个链接会给你你想要的。下面是选择查询。

select D.StudentName,D.subjectName,Isnull(C.marks,0) as Marks  from TableC C
Right Join
(select * from TableA A,TableB B
) D on C.studentID = D.studentID and C.subjectID = D.subjectID
于 2013-06-20T04:56:37.230 回答
1

如果你使用 sql server,试试这个

SELECT A.StudentName, B.SubjectName, ISNULL((SELECT TOP 1 Marks 
                                      FROM C
                                      WHERE C.StudentId = A.StudentId AND B.SubjectId = C.SubjectId),0) as Marks
FROM A,B
Order By A.StudentName

或者

;WITH StudentCourses As
(
  SELECT A.*,B.* 
  FROM A,B
}
SELECT StudentCourses.StudentName,StudentCourses.SubjectName,ISNULL(C.Marks,0) as Marks
FROM StudentCourses LEFT JOIN C ON C.StudentId =StudentCoursesA.StudentId AND StudentCourses.SubjectId = C.SubjectId

如果你使用 mysql,试试这个:

SELECT A.StudentName, B.SubjectName, IFNULL((SELECT Marks 
                                          FROM C
                                          WHERE C.StudentId = A.StudentId AND B.SubjectId = C.SubjectId),0) as Marks
    FROM A,B
    Order By A.StudentName
于 2013-06-20T03:48:42.743 回答
1

尝试:

SELECT a.StudentName, b.SubjectName, c.Marks
FROM A
LEFT JOIN C
ON A.StudentID = C.StudentID
LEFT JOIN B
ON B.SubjectID = C.SubjectID
于 2013-06-20T03:33:06.227 回答
0

你可以使用这个:

SELECT a.StudentName, b.SubjectName, c.Marks
FROM TableA a
LEFT JOIN TableB b
   ON 1 = 1
LEFT JOIN TableC c
   ON b.SubjectID = c.SubjectID
   AND a.StudentID = c.StudentID

演示: SQL 小提琴

于 2013-06-20T04:29:37.177 回答