SQL 三表联合问题, 50
我有3个表1,学生表2,作业表3,作业明细表学生表字段:学生名学生ID班级作业表字段:班级作业内容作业ID作业明细表:作业ID,学生ID,作业内容学生表是可以说是我的所有...
我有3个表 1, 学生表 2, 作业表 3, 作业明细表
学生表字段: 学生名 学生ID 班级
作业表字段: 班级 作业内容 作业ID
作业明细表: 作业ID, 学生ID, 作业内容
学生表是可以说是我的所有学生, 作业表是老师发布的作业, 明细表是每个学生的作业情况。
我想查询的是
1. 作业1
学生名 提交情况
1号学生 提交
2号学生 未提交
3号学生 未提交
2. 作业2
1号学生 提交
2号学生 未提交
不知这说明详不详细
再补充点就是 每个作业都显示以及 每个学生都显示(即使是未提交-未提交明细表里就不存在)
望高手解答。。。 展开
学生表字段: 学生名 学生ID 班级
作业表字段: 班级 作业内容 作业ID
作业明细表: 作业ID, 学生ID, 作业内容
学生表是可以说是我的所有学生, 作业表是老师发布的作业, 明细表是每个学生的作业情况。
我想查询的是
1. 作业1
学生名 提交情况
1号学生 提交
2号学生 未提交
3号学生 未提交
2. 作业2
1号学生 提交
2号学生 未提交
不知这说明详不详细
再补充点就是 每个作业都显示以及 每个学生都显示(即使是未提交-未提交明细表里就不存在)
望高手解答。。。 展开
5个回答
展开全部
--创建表
create table 学生表
(
id int identity(1,1),
学生名 nvarchar(20),
学生ID nvarchar(20),
班级 nvarchar(20),
primary key(学生ID)
)
GO
create table 作业表
(
id int identity(1,1),
班级 nvarchar(20),
作业内容 nvarchar(200),
作业ID nvarchar(20),
primary key(作业ID)
)
GO
create table 作业明细表
(
id int identity(1,1),
作业ID nvarchar(20),
学生ID nvarchar(20),
作业内容 nvarchar(200),
primary key(作业ID,学生ID),
foreign key(作业ID) references 作业表(作业ID),
foreign key(学生ID) references 学生表(学生ID),
)
--插入测试数据
insert into 学生表
values('1号学生','STU1001','1班')
GO
insert into 学生表
values('2号学生','STU1002','1班')
GO
insert into 学生表
values('3号学生','STU1003','1班')
GO
insert into 作业表
values('1班','作业内容111','作业1')
GO
insert into 作业表
values('1班','作业内容222','作业2')
GO
insert into 作业明细表
values('作业1','STU1001','作业内容111')
GO
insert into 作业明细表
values('作业2','STU1001','作业内容222')
--最终SQL查询语句
SELECT AA.作业ID,AA.学生名,CASE WHEN BB.作业内容 is null THEN '未提交' ELSE '已提交' END as 提交情况
FROM (SELECT A.作业ID,B.学生名
FROM 作业明细表 A,学生表 B) AA LEFT OUTER JOIN (SELECT C.作业ID,D.学生名,C.作业内容
FROM 作业明细表 C LEFT OUTER JOIN 学生表 D ON C.学生ID=D.学生ID) BB ON AA.学生名=BB.学生名 AND AA.作业ID=BB.作业ID
结果:
作业ID 学生名 提交情况
---------------------------------------
作业1 1号学生 已提交
作业1 2号学生 未提交
作业1 3号学生 未提交
作业2 1号学生 已提交
作业2 2号学生 未提交
作业2 3号学生 未提交
create table 学生表
(
id int identity(1,1),
学生名 nvarchar(20),
学生ID nvarchar(20),
班级 nvarchar(20),
primary key(学生ID)
)
GO
create table 作业表
(
id int identity(1,1),
班级 nvarchar(20),
作业内容 nvarchar(200),
作业ID nvarchar(20),
primary key(作业ID)
)
GO
create table 作业明细表
(
id int identity(1,1),
作业ID nvarchar(20),
学生ID nvarchar(20),
作业内容 nvarchar(200),
primary key(作业ID,学生ID),
foreign key(作业ID) references 作业表(作业ID),
foreign key(学生ID) references 学生表(学生ID),
)
--插入测试数据
insert into 学生表
values('1号学生','STU1001','1班')
GO
insert into 学生表
values('2号学生','STU1002','1班')
GO
insert into 学生表
values('3号学生','STU1003','1班')
GO
insert into 作业表
values('1班','作业内容111','作业1')
GO
insert into 作业表
values('1班','作业内容222','作业2')
GO
insert into 作业明细表
values('作业1','STU1001','作业内容111')
GO
insert into 作业明细表
values('作业2','STU1001','作业内容222')
--最终SQL查询语句
SELECT AA.作业ID,AA.学生名,CASE WHEN BB.作业内容 is null THEN '未提交' ELSE '已提交' END as 提交情况
FROM (SELECT A.作业ID,B.学生名
FROM 作业明细表 A,学生表 B) AA LEFT OUTER JOIN (SELECT C.作业ID,D.学生名,C.作业内容
FROM 作业明细表 C LEFT OUTER JOIN 学生表 D ON C.学生ID=D.学生ID) BB ON AA.学生名=BB.学生名 AND AA.作业ID=BB.作业ID
结果:
作业ID 学生名 提交情况
---------------------------------------
作业1 1号学生 已提交
作业1 2号学生 未提交
作业1 3号学生 未提交
作业2 1号学生 已提交
作业2 2号学生 未提交
作业2 3号学生 未提交
展开全部
-- 学生表
CREATE TABLE Student(
name VARCHAR(10),
Student_ID INT,
class_Name VARCHAR(4)
);
-- 作业表
CREATE TABLE SchoolWork(
class_Name VARCHAR(4),
work_ID INT,
work_info VARCHAR(10)
);
-- 作业明细
CREATE TABLE SchoolWorkDetail(
Student_ID INT,
work_ID INT,
work_info VARCHAR(10)
);
INSERT INTO Student
SELECT '1号学生', 1, '1班' FROM DUAL UNION ALL
SELECT '2号学生', 2, '1班' FROM DUAL UNION ALL
SELECT '3号学生', 3, '1班' FROM DUAL;
INSERT INTO SchoolWork
SELECT '1班', 1, '作业1' FROM DUAL UNION ALL
SELECT '1班', 2, '作业2' FROM DUAL;
INSERT INTO SchoolWorkDetail
SELECT 1, 1, '' FROM DUAL UNION ALL
SELECT 2, 2, '' FROM DUAL;
SELECT
SchoolWork.work_ID,
SchoolWork.work_info,
Student.Name,
CASE WHEN(SchoolWorkDetail.work_ID IS NULL) THEN '未提交'
ELSE '提交' END AS "提交情况"
FROM
SchoolWork CROSS JOIN Student
LEFT JOIN SchoolWorkDetail
ON (SchoolWork.work_ID = SchoolWorkDetail.work_ID
AND Student.Student_ID = SchoolWorkDetail.Student_ID)
ORDER BY
SchoolWork.work_ID,
Student.Name;
WORK_ID WORK_INFO NAME 提交情
---------- ---------- ---------- ------
1 作业1 1号学生 提交
1 作业1 2号学生 未提交
1 作业1 3号学生 未提交
2 作业2 1号学生 未提交
2 作业2 2号学生 提交
2 作业2 3号学生 未提交
已选择6行。
CREATE TABLE Student(
name VARCHAR(10),
Student_ID INT,
class_Name VARCHAR(4)
);
-- 作业表
CREATE TABLE SchoolWork(
class_Name VARCHAR(4),
work_ID INT,
work_info VARCHAR(10)
);
-- 作业明细
CREATE TABLE SchoolWorkDetail(
Student_ID INT,
work_ID INT,
work_info VARCHAR(10)
);
INSERT INTO Student
SELECT '1号学生', 1, '1班' FROM DUAL UNION ALL
SELECT '2号学生', 2, '1班' FROM DUAL UNION ALL
SELECT '3号学生', 3, '1班' FROM DUAL;
INSERT INTO SchoolWork
SELECT '1班', 1, '作业1' FROM DUAL UNION ALL
SELECT '1班', 2, '作业2' FROM DUAL;
INSERT INTO SchoolWorkDetail
SELECT 1, 1, '' FROM DUAL UNION ALL
SELECT 2, 2, '' FROM DUAL;
SELECT
SchoolWork.work_ID,
SchoolWork.work_info,
Student.Name,
CASE WHEN(SchoolWorkDetail.work_ID IS NULL) THEN '未提交'
ELSE '提交' END AS "提交情况"
FROM
SchoolWork CROSS JOIN Student
LEFT JOIN SchoolWorkDetail
ON (SchoolWork.work_ID = SchoolWorkDetail.work_ID
AND Student.Student_ID = SchoolWorkDetail.Student_ID)
ORDER BY
SchoolWork.work_ID,
Student.Name;
WORK_ID WORK_INFO NAME 提交情
---------- ---------- ---------- ------
1 作业1 1号学生 提交
1 作业1 2号学生 未提交
1 作业1 3号学生 未提交
2 作业2 1号学生 未提交
2 作业2 2号学生 提交
2 作业2 3号学生 未提交
已选择6行。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
as '姓名',nl as '年龄',bj as '班级',kc as '课程',Dscore as '成绩'
from Student,
left join subject on SID=FID
left join score on SName=DName
但是你的你的所有班级里不能有重名,否则会出错
或者在score表中加上学号字段
from Student,
left join subject on SID=FID
left join score on SName=DName
但是你的你的所有班级里不能有重名,否则会出错
或者在score表中加上学号字段
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
怎么可能?!
肯定要在作业明细表里设置“是否提交”的字段的,否则,电脑根据什么去判断哪个学生交作业呢?
至于查询,LZ可以设置必要的关系联接即可完成。但就目前而言,LZ对数据库的理解似乎还须加深。
肯定要在作业明细表里设置“是否提交”的字段的,否则,电脑根据什么去判断哪个学生交作业呢?
至于查询,LZ可以设置必要的关系联接即可完成。但就目前而言,LZ对数据库的理解似乎还须加深。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
(即使是未提交-未提交明细表里就不存在)是什么意思? 是否能详细说明一下。你要查询的是作业,结果应该是作业;而未提交明细表是另外的查询,你要的查询到底是什么表?能否详细说一下。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询