我有下表:
CREATE TABLE [dbo].[studies_profile]
(
[std_id] [int] NOT NULL,
[course_id] [int] NOT NULL,
[term_id] [int] NOT NULL
)
GO
CREATE TABLE [dbo].[student]
(
std_id int primary key not null,
std_fname nvarchar(50) null,
std_lname nvarchar(50) not null,
std_mail nvarchar(100),
std_birthdate datetime
)
GO
CREATE TABLE [dbo].[course]
(
course_id int primary key NOT NULL,
course_code int NOT NULL,
course_name nvarchar(15) NOT NULL,
course_program_code int NOT NULL,
)
GO
/* --------------------------------- */
ALTER TABLE studies_profile
ADD CONSTRAINT FK_course_studies_profile
FOREIGN KEY (course_id) REFERENCES course(course_id)
ON DELETE CASCADE ON UPDATE CASCADE
ALTER TABLE studies_profile
ADD CONSTRAINT FK_student_studies_profile
FOREIGN KEY (std_id) REFERENCES student(std_id)
ON DELETE CASCADE ON UPDATE CASCADE
INSERT INTO student
VALUES (1, 'aaa', 'g', '1@gmail.com', '2000-1-17'),
(2, 'bbb', 's', '2@gmail.com', '1999-2-17'),
(3, 'ccc', 'k', '3@gmail.com', '1995-3-17'),
(4, 'ddd', 'm', '4@gmail.com', '1998-4-17');
INSERT INTO course
VALUES (1, 1111, 'math', 1), (2, 1111, 'cpp', 1),
(3, 3333, 'mat', 2), (4, 4444, 'c++', 4),
(5, 5555, 'en', 5), (6, 6666, 'fr', 6);
当我运行以下查询时,没有得到任何返回,据我所知,这是多对多的关系。
我需要知道的是课程名aaa的学生的名字
select
student.std_fname, student.std_lname,
course.course_id, course.course_name
from
student
left join
studies_profile on (student.std_id = studies_profile.std_id)
left join
course on (studies_profile.course_id = course.course_id)
where
course.course_name = 'aaa'
答案 0 :(得分:1)
交集表dbo.studies_profile
为空(即OP不包含对该表的插入),因此不会返回任何结果。您需要使用映射数据填充它。完成后,您将收到结果。但是,正如@Uueerdo正确指出的那样,没有“ aaa”课程,因此您仍然不会收到结果。您还需要更正查询约束。
注意:SQL Server无法为您找出映射,因为它无法知道映射是什么。我不确定这是否是您的意图,但如果是这样,那就行不通了。