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号学生 未提交

不知这说明详不详细
再补充点就是 每个作业都显示以及 每个学生都显示(即使是未提交-未提交明细表里就不存在)
望高手解答。。。
展开
 我来答
百度网友d7ae1df
2011-04-08 · TA获得超过234个赞
知道小有建树答主
回答量:93
采纳率:0%
帮助的人:143万
展开全部
--创建表
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号学生 未提交
wangzhiqing999
2011-04-08 · TA获得超过1.6万个赞
知道大有可为答主
回答量:7048
采纳率:100%
帮助的人:3233万
展开全部
-- 学生表
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行。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户88921
2011-04-09 · TA获得超过347个赞
知道小有建树答主
回答量:553
采纳率:0%
帮助的人:0
展开全部
as '姓名',nl as '年龄',bj as '班级',kc as '课程',Dscore as '成绩'
from Student,
left join subject on SID=FID
left join score on SName=DName

但是你的你的所有班级里不能有重名,否则会出错
或者在score表中加上学号字段
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
whoAmI13
2011-04-08 · TA获得超过5833个赞
知道大有可为答主
回答量:2365
采纳率:50%
帮助的人:2219万
展开全部
怎么可能?!
肯定要在作业明细表里设置“是否提交”的字段的,否则,电脑根据什么去判断哪个学生交作业呢?
至于查询,LZ可以设置必要的关系联接即可完成。但就目前而言,LZ对数据库的理解似乎还须加深。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
神将飞蓬c3668
2011-04-08 · 超过79用户采纳过TA的回答
知道小有建树答主
回答量:159
采纳率:0%
帮助的人:138万
展开全部
(即使是未提交-未提交明细表里就不存在)是什么意思? 是否能详细说明一下。你要查询的是作业,结果应该是作业;而未提交明细表是另外的查询,你要的查询到底是什么表?能否详细说一下。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式