-2

以下是关系:

CREATE TABLE employee (
  fname    varchar2(15) not null, 
  minit    varchar2(1),
  lname    varchar2(15) not null,
  ssn      char(9),
  bdate    date,
  address  varchar2(30),
  sex      char,
  salary   number(10,2),
  superssn char(9),
  dno      number(4),
  primary key (ssn),
  foreign key (superssn) references employee(ssn),
  foreign key (dno) references department(dnumber)
);

CREATE TABLE department (
  dname        varchar2(15) not null,
  dnumber      number(4),
  mgrssn       char(9) not null, 
  mgrstartdate date,
  primary key (dnumber),
  unique (dname),
  foreign key (mgrssn) references employee(ssn)
);

CREATE TABLE dept_locations (
  dnumber   number(4),
  dlocation varchar2(15), 
  primary key (dnumber,dlocation),
  foreign key (dnumber) references department(dnumber)
);

CREATE TABLE project (
  pname      varchar2(15) not null,
  pnumber    number(4),
  plocation  varchar2(15),
  dnum       number(4) not null,
  primary key (pnumber),
  unique (pname),
  foreign key (dnum) references department(dnumber)
);

CREATE TABLE works_on (
  essn   char(9),
  pno    number(4),
  hours  number(4,1),
  primary key (essn,pno),
  foreign key (essn) references employee(ssn),
  foreign key (pno) references project(pnumber)
);

问:查找在休斯顿从事至少一个项目但其部门在休斯顿没有办公地点的所有员工的姓名和地址。

这是我的查询:

select fname, minit, lname, address
from employee
where dno=
(select dnumber from dept_locations where dlocation<>'Houston' and dnumber=
(select dno from employee where ssn=
(select essn from works_on where pno=
(select pnumber from project where plocation='Houston'))))

但它没有编译并返回此错误:

    ORA-01427: single-row subquery returns more than one row

请帮忙!

4

3 回答 3

0
select
  fname,
  minit,
  lname,
  address
from
  employee
where
  exists (
    select null
    from   works_on join project on (works_on.pno = project.pnumber)
    where  works_on.essn  = employee.ssn and
           not exists (
             select null
             from   dept_locations
             where  dept_locations.dlocation = project.plocation))

其他的建议:

  1. 表和列命名缺乏一致性是非常烦人的。DNO 和 DNUMBER?
  2. 使用社会安全号码作为键值是一个愚蠢的错误。这很愚蠢,因为人们的 SSN 是私有的,应该受到保护,这是一个错误,因为它不是一成不变的。
于 2013-04-11T09:11:47.567 回答
0
select fname, minit, lname, address
from employee
where dno in
(select dnumber from dept_locations where dlocation<>'Houston') and ssn in
(select essn from works_on where pno in
(select pnumber from project where plocation='Houston'))))
于 2013-04-11T03:38:02.420 回答
0

您的调用 "where dno=" 需要一个结果。

尝试

 where dno in (select...)
于 2013-04-11T03:38:36.453 回答