Как я могу напечатать имена и возраст каждого сотрудника, который работает как в отделе оборудования, так и в отделе программного обеспечения? - PullRequest
0 голосов
/ 06 апреля 2019

Я написал этот запрос для печати имени и возраста сотрудника, который работает в отделе аппаратного и программного обеспечения, но это не дает мне правильные результаты !!?

create table emp1 
(
eID integer PRIMARY key ,
eNAME varchar2(30),
age integer ,
salary integer
);        
 create table works 
  (
  eID integer REFERENCES emp1(eID),
  dID integer REFERENCES dept(dID1),
  pct_time integer 
  );
 create table dept
(
dID1 integer UNIQUE,
dNAME VARCHAR2(30) ,
budget integer ,
managerID integer ,
PRIMARY key(dID1,managerID)
 );

select eNAME,age from emp1 , works where works.dID in(select dept.dID1 
from  dept where dNAME='Hardware');

1 Ответ

1 голос
/ 06 апреля 2019

Одним из методов является использование EXISTS и связанных подзапросов для проверки наличия записей, отображающих сотрудника как на программное, так и на аппаратное обеспечение.

SELECT e.ename,
       e.age
       FROM emp1 e
       WHERE EXISTS (SELECT *
                            FROM works w
                                 INNER JOIN dept d
                                            ON d.did1 = w.did
                            WHERE d.name = 'Software')
             AND EXISTS (SELECT *
                                FROM works w
                                     INNER JOIN dept d
                                                ON d.did1 = w.did
                                WHERE d.name = 'Hardware');

Другой метод состоит в том, чтобы присоединить отделы к сотрудникам, отфильтровать программное или аппаратное обеспечение, а затем GROUP BY атрибуты сотрудника. Если они работают в обоих случаях, число идентификаторов отделов должно составлять 2. Это можно проверить в предложении HAVING.

SELECT e.name,
       e.age
       FROM emp1 e
            INNER JOIN works w
                       ON w.eid = e.eid
            INNER JOIN dept d
                       ON d.did1 = w.did
       WHERE d.dname IN ('Software',
                         'Hardware')
       GROUP BY e.ename,
                e.age
       HAVING count(DISTINCT d.did) = 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...