多对多关系返回空结果

时间:2018-07-03 20:07:59

标签: sql-server

我有下表:

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'

1 个答案:

答案 0 :(得分:1)

交集表dbo.studies_profile为空(即OP不包含对该表的插入),因此不会返回任何结果。您需要使用映射数据填充它。完成后,您将收到结果。但是,正如@Uueerdo正确指出的那样,没有“ aaa”课程,因此您仍然不会收到结果。您还需要更正查询约束。

注意:SQL Server无法为您找出映射,因为它无法知道映射是什么。我不确定这是否是您的意图,但如果是这样,那就行不通了。