【发布时间】: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