求SQL语句7

来源:百度知道 编辑:UC知道 时间:2024/05/15 00:39:50
假设在SQL Server 2005数据库中创建了如下的一些表:
CREATE TABLE 部门表
( 部门号 char(2) not null PRIMARY KEY,
部门名称 varchar(30) not null
)
CREATE TABLE 雇员表
( 雇员代号 char(4) not null PRIMARY KEY,
雇员姓名 varchar(20) not null
)
CREATE TABLE 任职表
( 雇员代号 char(4) not null,
部门号 char(2) not null,
开始时间 datetime not null,
备注 varchar(1000) null,
CONSTRAINT PK_Works PRIMARY KEY(雇员代号,部门号, 开始时间),
CONSTRAINT FK_Employees FOREIGN KEY (雇员代号)
REFERENCES 雇员表(雇员代号) ON DELETE CASCADE,
CONSTRAINT FK_Departments FOREIGN KEY (部门号)
REFERENCES 部门表(部门号)
)
现在人事经理需要获得在每个部门都工作过的雇员的名单,请写出带有子查询的SQL语句来完成改任务。

select * from 雇员表
where 雇员代号 in
(select 雇员代号 from 任职表 group by 雇员代号,部门号 having count(雇员代号) = (select count(*) from 部门表))

简单说下思路:
select count(*) from 部门表 是计算部门总数。
select 雇员代号 from 任职表 group by 雇员代号,部门号
这句是按雇员代号,部门号分组求所有任职信息
having count(雇员代号) 是求各个(雇员代号,部门号)分组的数量

如果各个(雇员代号,部门号)分组的数量 等于 部门总数,就说明该员工在每个部门都工作过。

mailking2001 - 助理 三级
不厚道啊
直接ctrl+C ctrl+V复制粘贴我原来的回答,而且一字不拉~~
厉害厉害,佩服佩服

记得下回Copy时加个出处。谢谢
-------------
这个问题前两天才有人问过的
http://zhidao.baidu.com/question/73234164.html

SELECT 部门表.部门名称, 雇员表.雇员姓名
FROM 部门表 INNER JOIN
任职表 ON 部门表.部门号 = 任职表.部门号 INNER JOIN
雇员表 ON 任职表.雇员代号 = 雇员表.雇员代号