【问题标题】:SQL Multiple foreign keys referring to the same tableSQL 多个外键引用同一张表
【发布时间】:2018-08-07 10:50:36
【问题描述】:

我有下表学生

Id  FirstName   LastName    State   Index   Year    Course1 Course2 Course3 Course4 Course5
622 Student622  LastName622 State17 62200   2   54  47  68  67  50
623 Student623  LastName623 State16 62300   3   17  99  37  99  32
624 Student624  LastName624 State2  62400   4   8   71  11  58  86
625 Student625  LastName625 State1  62500   2   39  75  33  77  17
626 Student626  LastName626 State15 62600   3   11  3   4   70  72
627 Student627  LastName627 State13 62700   2   84  77  65  62  76
628 Student628  LastName628 State13 62800   4   87  18  19  4   75
629 Student629  LastName629 State10 62900   2   96  67  14  97  31

Course 1, 2, 3, 4, 5 中的数字是引用以下 Courses 表的 id 的外键值:

Id  Name    ProfessorId
1   Course 1    8
2   Course 2    14
3   Course 3    4
4   Course 4    3
5   Course 5    6
6   Course 6    2
7   Course 7    14
8   Course 8    4
9   Course 9    5

如何编写脚本以便当我执行而不是外键数字时有课程名称?有什么想法吗?

【问题讨论】:

  • 提示:INNER JOIN
  • 欢迎了解每种 SQL 语言的基础知识:SQL Joins - Joins (SQL Server)
  • 这里真正的问题是您的学生表没有正确规范化。您的表中有所谓的“重复组”,它违反了 1NF。如果您修复设计,查询将很简单。

标签: sql sql-server foreign-keys


【解决方案1】:

您可以为每个课程 ID LEFT JOIN 到课程表。

SELECT 
s.Id, s.FirstName, s.LastName, s.State, s.[Index], s.[Year],
c1.Name as Course1Name,
c2.Name as Course2Name,
c3.Name as Course3Name,
c4.Name as Course4Name,
c5.Name as Course5Name  
FROM Student s
LEFT JOIN Courses c1 ON c1.Id = s.Course1
LEFT JOIN Courses c2 ON c2.Id = s.Course2
LEFT JOIN Courses c3 ON c3.Id = s.Course3
LEFT JOIN Courses c4 ON c4.Id = s.Course4
LEFT JOIN Courses c5 ON c5.Id = s.Course5

因为都是LEFT JOIN,所以Student的所有记录都会被返回。
即使某些课程 ID 没有填写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    相关资源
    最近更新 更多