2010-03-15 71 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 2010-03-16 00:01:54

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

如果我記得它是正確的,你應該在MS Access中明確寫入'INNER JOIN'。 – Li0liQ 2010-03-15 23:45:10

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