SQL Server 如果有许多id从一个表指向另一个表,如何知道应该使用哪些列来连接三个表?

fdbelqdn  于 2022-11-21  发布在  其他
关注(0)|答案(2)|浏览(148)

假设 我们 有 三 个 表 student 表 、 course 表 和 teacher 表 , 如下 所 示
" 学生 " 表
| 标准 标识|标准 名称|课程 标识|教师 标识|
| - -| - -| - -| - -|
| 一 个|拉梅什|一 个|一 个|
| 2 个|加内什|一 个|三 个|
| 三 个|阿德 什|三 个|三 个|
| 四 个|尼 莱什|三 个|一 个|
| 五 个|索南|三 个|四 个|
| 六 个|阿 比|2 个|四 个|
| 七 个|阿尼尔|2 个|四 个|
" 课程 " 表
| 课程 标识|课程 名称|标准 标识|教师 标识|
| - -| - -| - -| - -|
| 一 个|JAVA 语言|一 个|一 个|
| 2 个|Java 脚本|一 个|2 个|
| 三 个| VB.NET |一 个|一 个|
| 四 个|C # . NET 语言|五 个|2 个|
| 五 个|Python|五 个|四 个|
| 六 个|SAP 系统|六 个|四 个|
| 七 个|C + + 语言|六 个|一 个|
" 教师 " 表
| 教师 标识|教师 姓名|课程 标识|标准 标识|
| - -| - -| - -| - -|
| 一 个|罗伊|一 个|一 个|
| 2 个|阿米特|2 个|一 个|
| 三 个|若 翰|一 个|五 个|
| 四 个|约格 什|三 个|五 个|
| 五 个|洛基|三 个|一 个|
所以 我 已经 给 了 三 张 表 , 现在 我 想 给 学生 和 老师 看 一下 。
因此 , 您 可以 在 " student " 表 中 看到 std _ id 和 course _ id , 在 " course " 表 中 看到 course _ id 和 std _ id
因此 , 您 可以 在 student 表 中 看到 std _ id 和 course _ id , 在 course 表 中 看到 course _ id 和 std _ id
那么 这里 应该 使用 哪 一 列 来 连接 student 表 和 course 表 呢 ?
因为 这 两 个 表 都 有 std _ id 和 course _ id , 如果 我 想 显示 有 课程 的 学生 , 那么 在 这里 应该 使用 哪 一 列 来 连接 student 表 和 course 表 ?
我 还 想 在 这里 显示 教师 , 在 教师 表 中 , 我们 有 teacher _ id 、 course _ id 和 std _ id , 应该 使用 哪个 表 列 与 教师 表 连接 , 因为 student 表 也 有 teacher _ id , course 表 也 有 teacher _ id , 所以 应该 使用 哪个 表 teacher _ id 与 教师 表 连接 ?
请 让 我 知道 , 伙计 们 , 我 怎么 才能 知道 应该 用 哪 一 列 在 这里 加入 ?

zyfwsgd6

zyfwsgd61#

从左到右思考重要性。
如果您的主要目的是显示学生以及他们所修的课程,则[学生]数据表会在左边。如果您的主要目的是显示课程以及他们所修的学生,则[课程]数据表会在左边。如果您的主要目的是显示[教师]以及他们所教授的课程,则[教师]数据表会在左边。
在此基础上,根据需要使用尽可能多的左联接。因此,同样,如果您的主要目的是显示学生以及他们所修的课程,请将“学生”表左外联接到“学生.课程_ID =课程.课程_ID”上的“课程”表。然后,您可以将“课程”表左外联接到“课程.教师_ID =教师.教师_ID”上的“教师”表。
老实说,我认为您可以从Students表中删除Teacher_ID,因为教师与课程而不是学生相关联。同样,您可以从Course和Teacher表中删除Student_ID,因为这最终会创建多个记录。良好的表结构的目标实际上是尽可能减少一对多连接的可能性。

esyap4oy

esyap4oy2#

这里有一个SQL小技巧,告诉你如何连接所有的数据。这是一种方法,要想得到确切的答案,你必须提出一个更精确的问题。正如我在评论中所说的,原始的数据结构需要修正。没有必要让每个表都引用其他的表。最好是按目的分离数据。例如,教师表不应该引用学生表,除非它们之间存在某种直接关系,在这种情况下,教师将与他们教授的课程有逻辑关系...但没有理由链接到学生。学生被分配到一门课程。按照数据结构化的方式,student和course之间只能是一对一的关系(除非不必要地复制了大量数据)。我修改了数据结构,然后以逻辑方式创建了JOIN。我列出了所有的课程,添加了谁教这门课程,然后提供了注册这门课程的学生列表。
SQL小提琴

MS SQL Server 2017架构设置

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 |

相关问题