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连接语法。这是他们应该在学校里向你学习的,而不是过去的那种方式