![](/img/trans.png)
[英]Combine two different unrelated SQL queries( returning single column results) into one query result with two columns
[英]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
应该修复的东西:
考虑以下:
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.