您的位置:首页 > 数据库

SQL中一个表是否包含另外一个表的问题的实现

2010-03-22 23:01 453 查看
create table table1
(
id int primary key,
name varchar(40) not null
)
create table table2
(
id int primary key,
name varchar(40) not null
)
--查看表2是否包含表1
--如果表2不包含表1则输出表1的内容,否则如果表2包含表1则不输出表1
select * 
from table1
where exists 
(
--表1中有而表2中没有的数据。
--如果这个子查询有查询结果的话说明表1中有的数据在表2中不是全部都有的,
--所以表2不能包含表1
select * 
from table1
where not exists
(
select * 
from table2
where table1.id = table2.id 
)
)







上面的查询大体思想就是在table1中逐个取出元组,然后在table2中查找是否有这么一个元组。

如果table2有这个元组,表示table2包含这个元组,继续看table1的下一个元组。

如果table2没有这个元组,则表示table2不能完全包含table1,这样就可以实现查看一个表是否

包含另外一个表了。





就这么一个试验,我进行了下面的测试:查询所有课程中,被cs系全部老师教过的课程。

就事说找到这样一个课程:该课程被所有的老师都讲过。



于是有了下面的代码:

select * 
from course c
where not exists
(
select id
from 
(
select id
from professor
where deptid = 'cs'--找到cs系全部老师的编号id
) a  --给老师编号id的表起个别名为a
where not exists
(
select * 
from 
(
select profid
from teaching t
where t.crscode = c.crscode
) b --给从老师教课这个表中得到的教授了相应课程的老师的编号,这个表起名为b
where a.id = b.profid 
)
)





上面代码的意思是:

1.在课程course表中拿出一个课程C,

2.找到cs系的全部老师,

3.从cs系的老师中拿出一个老师T,然后从 老师-教课 这个表中查看老师T是否教了课程C

(1)如果老师T教了课程C,则继续看cs系的其他老师。如果cs系的其他老师也都教过课程C,

则课程C就是我们要找的课程。然后回到步骤1,重复。

(2)如果老师T没有教课程C,则可以直接断定课程C不是我们要找的课程,返回1,继续下一个课程。





这个查询大体就是上面解释这样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐