【问题标题】:How to select rows in a many-to-many relationship? (SQL)如何在多对多关系中选择行? (SQL)
【发布时间】:2019-10-31 19:02:28
【问题描述】:

我有一个学生表和一个课程表。 它们之间有多对多的关系,StudentCourses 表是中介。 现在,我有一个课程 ID 列表,并且想要选择关注我列表中所有课程的学生。 怎么样??

--CREATE TYPE CourseListType AS TABLE
--(
--  CourseID INT
--)

DECLARE
     @CourseList CourseListType

CREATE TABLE #Students
(
     ID INT
    ,Name CHAR(10)
)

CREATE TABLE #Courses
(
     ID INT
    ,Name CHAR(10)
)

CREATE TABLE #StudentCourses
(
     StudentID INT
    ,CourseID INT
)

INSERT INTO @CourseList (CourseID)
    VALUES
         (1) --English
        ,(2) --Math

INSERT INTO #Students (ID, Name)
VALUES
     (1, 'John')
    ,(2, 'Jane')
    ,(3, 'Donald')

INSERT INTO #Courses (ID, Name)
VALUES
     (1, 'English')
    ,(2, 'Math')
    ,(3, 'Geography')

INSERT INTO #StudentCourses (StudentID, CourseID)
VALUES
     (1, 1)
    ,(1, 2)
    ,(2, 1)
    ,(2, 2)
    ,(3, 1)
    ,(3, 3)

在本例中,我只希望结果是 John 和 Jane,因为他们在我的 CourseList 中都有这两门课程。 我不要唐纳德,因为他只有一个。

已经尝试过这种JOIN、构建,但它并没有排除那些只有我想要的一些课程的学生。

SELECT 
    * 
FROM 
    @CourseList CRL
    INNER JOIN #Courses CRS ON CRS.ID = CRL.CourseID
    INNER JOIN #StudentCourses STC ON STC.CourseID = CRS.ID
    INNER JOIN #Students STD ON STD.ID = STC.StudentID

【问题讨论】:

  • 加入。使用 WHERE 子句仅选择所需的课程 ID。
  • 让帮助您变得简单且可能:minimal reproducible example.
  • 您可以链接JOINs 以使用多个链接表
  • 一个不需要知道查询的约束。表的含义——一行在表中以列值表示的意思——是必要的和充分的。 PS“与所有有关”或“与每个有关”涉及“关系划分”。 PS你有一个典型的模棱两可——如果没有课程,你想要所有学生还是没有? minimal reproducible example PS 在给出业务关系(船舶)/关联或表(基础或查询结果)时,说明其中的一行根据其列值说明了业务情况。
  • 这是一个常见问题解答。在考虑发布之前,请始终使用谷歌搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和站点:stackoverflow.com 和标签,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。

标签: sql join many-to-many


【解决方案1】:

如果您希望学生学习所有必修课程,您可以使用聚合和having

SELECT sc.StudentId 
FROM #StudentCourses sc JOIN
    @CourseList cl
    ON sc.CourseID = cl.id
GROUP BY sc.StudentId
HAVING COUNT(DISTINCT sc.CourseId) = (SELECT COUNT(*) FROM @DcourseList);

如果您想了解有关学生的更多信息,可以加入Students 表(或使用IN 或类似结构)。

请注意,这只需要StudentCourses 表。它具有匹配的 ID。无需加入参考表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2018-06-25
    • 2011-03-01
    相关资源
    最近更新 更多