SQL Server以特定格式显示查询输出

SQL Server以特定格式显示查询输出,sql,sql-server,database,Sql,Sql Server,Database,问题: 如何显示该学生未修过的每门课程的学生姓名、系名和课程名称 我尝试过使用生成笛卡尔积,如下所示: SELECT NAME, student.dept_name, title FROM student JOIN (SELECT id, title FROM takes, course WHERE takes.course_id <> course.course_id)

问题:

如何显示该学生未修过的每门课程的学生姓名、系名和课程名称

我尝试过使用生成笛卡尔积,如下所示:

SELECT  
    NAME, student.dept_name, title
FROM 
    student
JOIN 
    (SELECT 
         id, title
     FROM 
         takes, course
     WHERE 
         takes.course_id <> course.course_id) a ON student.id = a.id
ORDER BY 
    NAME ASC, title ASC

执行一个查询,该查询通过笛卡尔连接获取学生和课程的所有组合,然后通过执行“除外”下面的第二个查询删除学生已完成的所有课程。这将处理尚未完成任何课程的学生,这就是“不存在”不起作用的原因

Select s.id, c.title 
From student s cross join courses c
Except
Select t.id, c.title 
From takes t join courses c on t.course_id = c.course_id

事实上,一个学生的课程之间没有联系,这不是一个问题,你需要知道一个学生可以选择的所有课程

学生

Name       CourseId
---------- ----------
Zishan     1,2,3
Ellen      2,3,4

(2 row(s) affected)
课程

courseid    coursename
----------- ----------
1           java
2           C++
3           oracle
4           dot net
所修课程

sid                  cid
-------------------- -----------
zishan               1
zishan               2

(2 row(s) affected)
select sc.Studentname,sc.Coursename,ct.cid
from
(
select s.Name Studentname, c.courseid cid,c.coursename CourseNAme
from student s
cross join course c
) sc
left join courses_taken  ct on sc.StudentName = ct.sid and sc.cid = ct.cid
像这样的交叉连接

select s.Name Studentname, c.courseid cid,c.coursename CourseNAme
from student s
cross join course c
导致

Studentname cid         CourseNAme
----------- ----------- ----------
Zishan      1           java
Zishan      2           C++
Zishan      3           oracle
Zishan      4           dot net
Ellen       1           java
Ellen       2           C++
Ellen       3           oracle
Ellen       4           dot net
Studentname Coursename cid
----------- ---------- -----------
Zishan      oracle     NULL
Zishan      dot net    NULL
Ellen       java       NULL
Ellen       C++        NULL
Ellen       oracle     NULL
Ellen       dot net    NULL

(6 row(s) affected)
参加你参加的课程

sid                  cid
-------------------- -----------
zishan               1
zishan               2

(2 row(s) affected)
select sc.Studentname,sc.Coursename,ct.cid
from
(
select s.Name Studentname, c.courseid cid,c.coursename CourseNAme
from student s
cross join course c
) sc
left join courses_taken  ct on sc.StudentName = ct.sid and sc.cid = ct.cid
结果是

Studentname Coursename cid
----------- ---------- -----------
Zishan      java       1
Zishan      C++        2
Zishan      oracle     NULL
Zishan      dot net    NULL
Ellen       java       NULL
Ellen       C++        NULL
Ellen       oracle     NULL
Ellen       dot net    NULL
要排除采用空where条件的课程

select sc.Studentname,sc.Coursename,ct.cid
from
(
select s.Name Studentname, c.courseid cid,c.coursename CourseNAme
from student s
cross join course c
) sc
left join courses_taken  ct on sc.StudentName = ct.sid and sc.cid = ct.cid
where ct.cid is null
导致

Studentname cid         CourseNAme
----------- ----------- ----------
Zishan      1           java
Zishan      2           C++
Zishan      3           oracle
Zishan      4           dot net
Ellen       1           java
Ellen       2           C++
Ellen       3           oracle
Ellen       4           dot net
Studentname Coursename cid
----------- ---------- -----------
Zishan      oracle     NULL
Zishan      dot net    NULL
Ellen       java       NULL
Ellen       C++        NULL
Ellen       oracle     NULL
Ellen       dot net    NULL

(6 row(s) affected)
一个
交叉连接
形成了一个
笛卡尔积
,它形成了学生+课程的所有组合。外部连接是指潜在的大集合,以实际集合的学生报名参加课程。然后,未连接的行构成了(每个)学生尚未参加的课程

如果问题有一个小的“转折点”,而你所需要的只是未修课程的列表,那么:

select distinct
    c.*
from students s
cross join courses c
left join takes t on s.student_id = t.id -- naming looks weird
                 and c.course_id = t.course_id
where t.student_id IS NULL
order by
  c.title -- or similar

将结果简化为未完成的课程。

请共享架构和所需输出。我已将架构和所需输出放入:)您的查询不是笛卡尔积(这是一个
交叉连接
),逻辑上笛卡尔积/交叉连接应该在学生到课程上。请使用ansi连接语法。这是他们应该在学校里向你学习的,而不是过去的那种方式