2010-03-15 3 views
0

Для следующих определений таблиц:Очень трудно SQL-запрос

Name       Null? Type   Comments 
------------------------------- -------- ----   ------------------------------------ 
ENUM       NOT NULL NUMBER(4)  ENUM should not exceed a length of 4. 
ENAME         CHAR(15)  
ADDRESS         CHAR(25)  ADDRESS should not exceed 25 characters. 
SALARY         NUMBER(5)  
OFFICE         CHAR(4) 
DNUM       NOT NULL NUMBER(4)  Department which this employee belongs to 

department 

Name       Null? Type   Comments 
------------------------------- -------- ----   ------------------------------------- 
DNUM       NOT NULL NUMBER(4) 
DMGR       NOT NULL NUMBER(4)  Department manager 
DNAME       NOT NULL CHAR(15) 

project 

Name       Null? Type   Comments 
------------------------------- -------- ----   ------------------------------------- 
PNUM       NOT NULL NUMBER(4) 
PMGR       NOT NULL NUMBER(4)  Project manager 
PTITLE       NOT NULL CHAR(15) 

emp_proj 

Name       Null? Type 
------------------------------- -------- ---- 
PNUM       NOT NULL NUMBER(4) 
ENUM       NOT NULL NUMBER(4) 

Я должен написать SQL запрос, который будет найти имена сотрудников, которые не разделяют офис, но работу по тому же проекту, и имеют разные зарплаты ... Я провел последние три дня, пытаясь что-то выяснить, но понятия не имею. Буду признателен за любые советы.

ответ

2

Это может быть простой со всеми неявной объединения (это только проверяет, что они работают, по крайней мере, один из тех же проектов - работает на всех тех же проектов немного другая проблема, не так просто):

SELECT * 
FROM emp AS emp1 
    ,emp_proj AS empproj1 
    ,emp AS emp2 
    ,emp_proj AS empproj2 
WHERE emp1.ENUM = empproj1.ENUM 
     AND emp2.ENUM = empproj2.ENUM 
     AND emp2.ENUM <> emp1.ENUM -- not joined to same employee 
     AND empproj1.PNUM = emp_proj2.PNUM -- same project 
     AND emp1.OFFICE <> emp2.OFFICE -- not same office 
     AND emp1.SALARY <> emp2.SALARY -- not same salary 

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

+0

+1: может изменить положение в 'emp2.ENUM> emp1.ENUM' вместо' <> ', так что он не будет показывать симметричные дубликаты. Также можно добавить 'DISTINCT' для выбора, чтобы удалить дубликаты из-за нескольких совместно используемых проектов. – van

0
select e1.ename, e2.ename from 
    employee e1 join employee e2 
     on (e1.salaray != e2.salary AND e1.office != e2.office) 
     join emp_proj p1 
      on (e1.enum == p1.enum) 
      join emp_proj p2 
       on (e2.enum == p2.enum) 
where p1.pnum == p2.pnum 

Это вернет 2 результата для каждого набора имен, но с перевернутыми позициями. например «Джо и Джек» и «Джек и Джо». Поскольку это домашнее задание, было бы хорошим упражнением для вас выяснить, как изменить запрос, чтобы не возвращать дубликаты.

+0

Если я правильно напомню, вы должны явно написать 'INNER JOIN' в MS Access. – Li0liQ

1

вы можете использовать общее табличное выражение ..

;WITH #emp_CTE AS 
(select name.enum, emp_proj.Pnum, name.office ,name.salary 
from name inner join emp_proj 
on name.enum=emp_proj.enum) 

select * from #emp_CTE a join #emp_CTE b on a.Pnum=b.Pnum 
And a.office!=b.office AND a.salary!=b.salary 
Смежные вопросы