繁体   English   中英

如何将两个 SQL 查询结果添加到一个结果表中,每个查询结果具有不同的列?

[英]How to add two SQL queries results in one resultant table with different columns for each query result?

我有两个 sql 查询:1:

select student.name , subject.name as s1 , teacher.name
from student
inner join teacher
on student.[subj2-t-id] = teacher.[t-id]
inner join subject
on teacher.[s-id] = subject.[s-id]

2:

select student.[std-id] , subject.name as s2 , teacher.[t-id]
from student
inner join teacher
on student.[subj1-t-id] = teacher.[t-id]
inner join subject
on teacher.[s-id] = subject.[s-id]

现在我想合并这两个结果,但是列应该在结果表中分开,比如一个有六列的表,第一个查询结果的 3 个和第二个查询结果的 3 个。 请帮助我,我该怎么做?

这是一些演示数据,代表我在这个问题上的工作:部门表:

d-id    name
111     English   
112      IT  

主题表:

s-id    name       d-id
234    Eng-com      111       
235    Data Str     112       
236      OS         112       
237    Grammer      111 

教师表:

t-id        name        d-id        s-id
60          Ahmed       112         236       
61          Ali         111         234       
62          Nawaz       111         237       
63          Imran       112         235    

学生表:

std-id       name       d-id     subj1-t-id  subj2-t-id
20          Hassan      112         63          61        
21          Momin       112         60          62        
22          Hussain     111         61          63        
23          Najeeb      112         63          62        
24          Qasim       111         62          60  

这里学生表 subject1 和 subject2 属性是来自教师表的 teacherID。 两者都是FK。 类似地,D-ID 和 S-ID 代表 department id 和 subject id 在 teacher 表中是 FK。 并且 D-ID 在 Subject 表中是 FK。

做出一些可能会改变所需 output 的相当大的假设。首先,使用一些演示数据:

DECLARE @Student TABLE ([std-id] INT IDENTITY, Name NVARCHAR(50), [Subj1-t-id] INT, [Subj2-t-id] INT)
DECLARE @Teacher TABLE ([t-id] INT IDENTITY, Name NVARCHAR(50), [s-id] INT)
DECLARE @Subject TABLE ([s-id] INT IDENTITY, Name NVARCHAR(50))

INSERT INTO @Subject (name) VALUES
('Math'),('Science'),('English')
INSERT INTO @Teacher (name, [s-id]) VALUES
('Mr Maths',1),('Mrs Science',1),('Mrs Science',2),('Dr English',3)
INSERT INTO @Student (Name, [Subj1-t-id], [Subj2-t-id]) VALUES
('Pike',3,1),('Kirk',1,NULL),('Picard',NULL,3),('Riker',2,1)

我们可以通过向教师和主题表添加辅助连接来查询这些表以在单个查询中生成请求的输出:

select student.name , subject.name as s1 , teacher.name, student.[std-id] , subject2.name as s2 , teacher2.[t-id]
  FROM @student AS student
  LEFT join @teacher AS teacher
    ON student.[subj2-t-id] = teacher.[t-id]
  LEFT join @subject AS subject
    ON teacher.[s-id] = subject.[s-id]
  LEFT OUTER JOIN @teacher AS teacher2
    ON student.[subj1-t-id] = teacher2.[t-id]
  LEFT OUTER join @subject AS subject2
    ON teacher2.[s-id] = subject2.[s-id] 

您会注意到所有连接都是 LEFT OUTER。 这是因为(取决于您的架构定义)学生可能有 1 个或 2 个科目,其中一个科目列为 NULL。我们可能仍希望这些学生出现在结果集中。 每个表都添加了一个别名,因此我们可以在查询中唯一地引用它。 首先,我们在第一个主题栏中加入学生和老师,然后是主题。 然后我们再次加入教师表,在另一个主题列上,并使用它进入主题。 我们现在拥有所有六个必需的列。

name    s1      name        std-id  s2      t-id
------------------------------------------------
Pike    Math    Mr Maths    1       Science 3
Kirk    NULL    NULL        2       Math    1
Picard  Science Mrs Science 3       NULL    NULL
Riker   Math    Mr Maths    4       Math    2

应该修复的东西:

  • 表名通常应该是复数形式。 在这种情况下,学生表包含 1 到许多学生,它的名称应该反映这一点。
  • 表应该尽可能完整地描述一个实体(并且只描述那个实体)。
  • object 名称中应避免使用非法字符和保留字,除非这是不可避免的。 数据应规范化。
  • 拥有诸如“Teacher1”和“Teacher2”之类的列会限制您的设计,这将在以后引起问题。 相反,可以使用查找对象。
  • 别名应该始终用于表格。

考虑以下:

DECLARE @StudentClasses TABLE (StudentID INT, ClassID INT)
DECLARE @Teachers TABLE (TeacherID INT IDENTITY, Name NVARCHAR(50), ClassID INT)
DECLARE @Subjects TABLE (SubjectID INT IDENTITY, Name NVARCHAR(50))
DECLARE @Classes TABLE (ClassID INT IDENTITY, Name NVARCHAR(50), TeacherID INT, SubjectID INT)

INSERT INTO @Subjects (Name) VALUES
('Math'),('Science'),('English')
INSERT INTO @Teachers (Name, ClassID) VALUES
('Mr Maths',1),('Mrs Science',1),('Mrs Science',2),('Dr English',3)
INSERT INTO @Classes (Name, TeacherID, SubjectID) VALUES
('Math 101', 2, 1),('Math 102', 1, 1),
('Science 101', 2, 2),('Science 101', 2, 2),
('English 101', 1, 3),('English Lit', 1, 3),
('English 900', 3, 3)
INSERT INTO @Students (Name) VALUES
('Pike'),('Kirk'),('Picard'),('Riker')
INSERT INTO @StudentClasses (StudentID, ClassID) VALUES
(1,1),(1,2),(1,3),(2,2),(2,3),(2,4),
(3,2),(4,4),(4,5)

SELECT s.StudentID, s.Name AS StudentName, c.Name AS ClassName, t.Name AS TeacherName, su.name AS SubjectName
  FROM @Students s
    INNER JOIN @StudentClasses sc
      ON s.StudentID = sc.StudentID
    INNER JOIN @Classes c
      ON sc.ClassID = c.ClassID
    INNER JOIN @Teachers t
      ON c.TeacherID = t.TeacherID
    INNER JOIN @Subjects su
      ON c.SubjectID = su.SubjectID
 ORDER BY StudentID
StudentID   StudentName ClassName   TeacherName SubjectName
-----------------------------------------------------------
1           Pike        Math 101    Mrs Science Math
1           Pike        Math 102    Mr Maths    Math
1           Pike        Science 101 Mrs Science Science
2           Kirk        Math 102    Mr Maths    Math
2           Kirk        Science 101 Mrs Science Science
2           Kirk        Science 101 Mrs Science Science
3           Picard      Math 102    Mr Maths    Math
4           Riker       Science 101 Mrs Science Science
4           Riker       English 101 Mr Maths    English

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM