-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)
);

Q: ヒューストンに所在する少なくとも 1 つのプロジェクトに取り組んでいるが、部門がヒューストンに所在していないすべての従業員の名前と住所を検索します。

これが私のクエリです:

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 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 に答える
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 に答える