如何知道哪个列应该用于连接三个表,如果许多id从一个表指向另一个?



假设我们有三个表学生表、课程表和教师表,如下所示

"学生"表
<表类>std_idstd_namecourse_idteacher_idtbody><<tr>1拉梅什112Ganesh133Aadesh334里315Sonam346Abhi247Anil24

考虑重要性从左到右

如果您主要关注的是显示学生和他们学习的课程,那么students表在左侧。如果您主要关注的是显示课程以及哪些学生选修了这些课程,那么课程表就在左侧。如果您主要关注的是显示教师及其教授的课程,那么教师表在左侧。

从那里,使用尽可能多的左连接是必要的。因此,如果您主要关注的是显示学生及其选修的课程,请将students表左外连接到students上的courses表。Course_ID = Courses.Course_ID。然后,您可以将Courses表左外部连接到Course上的Teachers表。

老实说,我认为您可以从Students表中删除Teacher_ID,因为教师绑定到课程而不是学生。类似地,您可以从Course和Teacher表中删除Student_ID,因为这最终将创建多个记录。良好的表构造的目的实际上是尽可能地减少1:Many连接的可能性。

这里有一个关于如何连接所有内容的SQL教程。这是一种方法,为了得到一个确切的答案,你必须提出一个更精确的问题。正如我在评论中所说,原始数据结构需要固定。不需要每个表都引用其他表。最好按目的保持数据隔离。例如,教师表不应该引用学生表,除非它们之间存在某种直接关系。在这种情况下,老师将与他们所教的课程有一个逻辑关系……但没有理由去联系那个学生。这个学生被分配到一门课程。按照数据结构的方式,学生和课程之间只能是1对1的关系(除非您不必要地复制了大量数据)。我固定了数据结构,然后以逻辑方式创建了JOIN。我列出了所有的课程,添加了教授这门课程的人,然后提供了一份注册这门课程的学生名单。

SQL小提琴

MS SQL Server 2017 Schema Setup:

CREATE TABLE student (
std_id int not null
, std_name nvarchar(50) not null
);

CREATE TABLE course (
course_id int not null
, course_name nvarchar(50) not null
, teacher_id int null
);
CREATE TABLE teacher (
teacher_id int not null
, teacher_name nvarchar(50) not null
);
CREATE TABLE course_x_student (
uid int IDENTITY(1,1) not null
, course_id int not null
, std_id int not null
);
INSERT INTO student (std_id, std_name)
VALUES (1, 'Ramesh')
, (2, 'Ganesh')
, (3, 'Aadesh')
, (4, 'Nilesh')
;

INSERT INTO teacher (teacher_id, teacher_name)
VALUES (1, 'Roy')
, (2, 'Amit')
;
INSERT INTO course (course_id, course_name, teacher_id)
VALUES (1, 'JAVA', 1)
, (2, 'JAVASCRIPT', 1)
, (3, 'VB.NET' , 2)
;
INSERT INTO course_x_student (std_id, course_id)
VALUES (1, 1)
, (2, 1)
, (3, 3)
, (4, 3)
;

查询1:

SELECT 
c.*
, t.teacher_name
, STUFF((
SELECT ',' + CAST(s.std_id as nvarchar) + ':' + s.std_name
FROM student as s
INNER JOIN course_x_student as cxs
ON cxs.std_id = s.std_id
AND cxs.course_id = c.course_id
FOR XML PATH('')
),1,1,'') as student_list
FROM course as c
LEFT OUTER JOIN teacher as t
ON t.teacher_id = c.teacher_id

结果:

| course_id | course_name | teacher_id | teacher_name |      student_list |
|-----------|-------------|------------|--------------|-------------------|
|         1 |        JAVA |          1 |          Roy | 1:Ramesh,2:Ganesh |
|         2 |  JAVASCRIPT |          1 |          Roy |            (null) |
|         3 |      VB.NET |          2 |         Amit | 3:Aadesh,4:Nilesh |

最新更新