Subconsultas locas de Oracle SQL en 4 tablas

Aquí están las relaciones:

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

P: Encuentre los nombres y direcciones de todos los empleados que trabajan en al menos un proyecto ubicado en Houston pero cuyo departamento no tiene ubicación en Houston.

Aquí está mi consulta:

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

Pero no compiló y devolvió este error:

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

Por favor, ayuda!

preguntado el 11 de abril de 13 a las 04:04

dno no se puede = varias filas. Intenta usar IN en lugar de = y use OR entre los submarinos -

¿Realmente vas a hacer una publicación para cada pregunta en tu tarea? -

Sólo los que no pude descifrar. Terminé el 90% restante por mi cuenta. Lo siento si te molestan. -

@DanJ, ​​para ser justos, la barrera del conocimiento para conseguir un trabajo escribiendo código de Oracle es muy baja hoy en día: apenas necesita habilidades de Google para buscar sintaxis o ejemplos, u orientación sobre problemas específicos. Simplemente publica cualquier cosa vagamente difícil en Stackoverflow. Dowvoting preguntas es el camino a seguir con estas cosas. -

3 Respuestas

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

Respondido 12 Abr '13, 04:04

seleccione pnumber del proyecto donde ubicación = 'Houston' y verifique que proporcione el pnumber correcto que requería ... porque no hay otra razón para dar un resultado incorrecto - Amit Singh

Sí, ejecutar esa consulta solo me dio el resultado correcto. - maxspiderx

(seleccione dno de empleado donde ssn en (seleccione essn de trabajos_en donde pno aquí escribe ssn en un lugar y essn en otro lugar... ¿por qué? - Amit Singh

seleccione pnumber del proyecto donde plocation='Houston' (seleccione dnumber de dept_locations donde dlocation<>'Houston' primero está seleccionando el lugar solo houston... y luego selecciona el lugar que no es hpuston... por eso... está recibiendo resultado en blanco correcto.... - Amit Singh

Estoy tratando de mover el orden de las subconsultas según su sugerencia. Volveré a informar con más problemas. ¡Gracias! - maxspiderx

Su llamada "where dno=" espera un único resultado.

tratan

 where dno in (select...)

Respondido 11 Abr '13, 04:04

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

Otros comentarios:

  1. La falta de consistencia en la denominación de tablas y columnas es muy irritante para trabajar. DNO y DNUMBER?
  2. Usar un número de seguro social como valor clave es un error estúpido. Es estúpido porque los SSN de las personas son privados y deben protegerse, y es un error porque no es inmutable.

Respondido 11 Abr '13, 15:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.