SQL查询两个表中的

问题描述:

我有以下查询其收集从2个表(StudentsSubjectsSQL查询两个表中的

SELECT 
    'StudentName' As Student, 
    'Class' As Class, 
    'Subject' As Subject 
    DATEDIFF(HOUR, hoursSpent.ClassStartTime, hoursSpent.ClassEndTime) As HoursSpent 
    FROM (
     SELECT stu.StudentName from Students s 

     INNER JOIN Subjects sub 
     WHERE stu.StudentId = sub.StudentId 
     ) hoursSpent 

一些信息数据组合起来我还有一个表作为布局Students表称为OldStudents这是完全一样的。

我的问题是我想结合StudentsOldStudents的数据,并显示为一个,但没有线索我怎么能做到这一点。

我试过,但这个不起作用:

SELECT 
    'StudentName' As Student, 
    'Class' As Class, 
    'Subject' As Subject 
    DATEDIFF(HOUR, hoursSpent.ClassStartTime, hoursSpent.ClassEndTime) As HoursSpent 
    SELECT(
      FROM (
       SELECT stu.StudentName from Students s 
       INNER JOIN Subjects sub 
       WHERE stu.StudentId = sub.StudentId 
       ) hoursSpent, 
      FROM (
       SELECT stu.StudentName from Students s 
       INNER JOIN Subjects sub 
       WHERE stu.StudentId = sub.StudentId 
       ) hoursSpent) 
+2

你是什么意思的“结合”吗?结果集与这两个表相关的结果是什么? – Oded 2013-02-21 21:57:08

+0

@Oded - 那么现在结果显示如下:StudentName,Class,Subject和HoursSpent。同样的,它会先从OldStudents中获取这些值,然后再将它们填充到一张表中。 – NoviceMe 2013-02-21 21:58:57

你可以尝试合并(unioning)StudentsOldStudents,然后加入结果查询的其余部分:

WITH AllStudents 
AS (
    SELECT * FROM Students 
    UNION 
    SELECT * FROM OldStudents 
) 
SELECT 
    'StudentName' As Student, 
    'Class' As Class, 
    'Subject' As Subject 
    DATEDIFF(HOUR, hoursSpent.ClassStartTime, hoursSpent.ClassEndTime) As HoursSpent 
    FROM (
     SELECT stu.StudentName from AllStudents stu 
     INNER JOIN Subjects sub 
     WHERE stu.StudentId = sub.StudentId 
     ) hoursSpent 
+0

真棒整齐干净正是我正在寻找。谢谢! – NoviceMe 2013-02-21 22:16:00

如果你只想一组数据添加到其他使用UNION操作:

SELECT * FROM TableA 
UNION 
SELECT * FROM TableB 

每个SELECT语句必须有相同的列数

+0

OOPS!我正是这个意思。感谢Jeff抓住我的漏洞 - 我纠正了我的答案。脸红。 – Melanie 2013-02-21 22:01:09

+0

但是使用联合将不会使这些事情复杂化,因为这两个表都使用联接?这是最好的方法吗? – NoviceMe 2013-02-21 22:01:40

+0

@NoviceMe这只是'UNION'的一个普遍的例子。看看其他两个答案,因为他们有解决方案。一个将学生和老学生联合在一起,然后加入到学科,另一个加入学生和科目,然后加入老学生和科目,然后联合他们。 – techturtle 2013-02-21 22:05:52

本质上,您需要有两个相同的查询,每个表使用一个并使用UNION(或UNION ALL来conc atenate他们:

SELECT 
    'StudentName' As Student, 
    'Class' As Class, 
    'Subject' As Subject 
    DATEDIFF(HOUR, hoursSpent.ClassStartTime, hoursSpent.ClassEndTime) As HoursSpent 
    FROM (
     SELECT stu.StudentName from Students s 

     INNER JOIN Subjects sub 
     WHERE stu.StudentId = sub.StudentId 
     ) hoursSpent 
UNION ALL 
SELECT 
    'StudentName' As Student, 
    'Class' As Class, 
    'Subject' As Subject 
    DATEDIFF(HOUR, hoursSpent.ClassStartTime, hoursSpent.ClassEndTime) As HoursSpent 
    FROM (
     SELECT stu.StudentName from OldStudents s 

     INNER JOIN Subjects sub 
     WHERE stu.StudentId = sub.StudentId 
     ) hoursSpent 

UNION会使结果不同,UNION ALL不会。

+0

如果老学生永远不是现在的学生,UNION ALL就足够了。 – RandomUs1r 2013-02-21 22:04:08

+0

@ Syn123 - 你的意思是'联合'。 – Oded 2013-02-21 22:04:33

+0

@Oded - 这是这种情况下最好的方法吗? – NoviceMe 2013-02-21 22:04:46