2011-02-02 87 views
0

讓我們的經典自連接例如Employee表中,我們有列empId,managerId,empName,Managername。我想看到,誰是經理,然後在表名稱另一名加盟經理的名字每一個員工。現在,我有問題的部分是,經理ID可以是空的一些記錄。在這些情況下,SQL不起作用,因爲mgr.name是空的,其有MGRID爲空行:SQL自聯接與空值的問題

SELECT emp.Name, mgr.Name FROM Employee e 
LEFT JOIN Employee mgr ON e.empId=mgr.mgrId 
JOIN Name nm ON nm.name = mgr.Name 

是否有人可以提供一個解決方案?

對不起,這個問題過於簡單: 它更像每個員工行,我也想要mgr行(mgrId是empId的行),然後將mgr行的屬性連接到其他表。類似這樣的:

select 
    emp.empId,mgr.empId,dept.deptName 
from Employee emp 
JOIN Address addr on 
    emp.houseNo = addr.houseNo 
JOIN dept dept on 
    dept.deptAddress = addr.deptAddress 
LEFT JOIN Employee mgr on 
    emp.empId = mgr.empId 
JOIN Address address on 
    mgr.houseNo = address.houseNo 
JOIN dept department on 
    department.houseNo=address.deptAddress 
where 
    department.deptId=dept.deptId 

使用所有左連接對此不起作用。謝謝您的幫助。

+0

在你大SQL這樣的:LEFT JOIN員工經理在emp.empId = mgr.empId看起來不正確。不應該是LEFT JOIN Employee mgr on emp.mgrId = mgr.empId – JBrooks 2011-02-02 04:38:42

回答

8

一旦你引入了一個左連接,你通常也想跟隨所有後續的連接。一個單一的INNER JOIN在鏈中減少一切之前它爲內連接爲好。

SELECT 
    emp.Name, mgr.Name 
FROM Employee e 
LEFT JOIN Employee mgr ON 
    e.empId = mgr.mgrId 
LEFT JOIN Name nm ON 
    nm.name = mgr.Name 
0

只需推動ON子句就在哪裏更合適

SELECT emp.Name, mgr.Name 
FROM Employee e 
    LEFT JOIN Employee mgr 
     JOIN Name nm 
     ON nm.name = mgr.Name 
    ON e.empId=mgr.mgrId 
2

首先,不要你有backwords的加入?不應

  ON e.empId = mgr.mgrId 

  ON e.mgrId = mgr.empId 

即使你的作品命名錶「經理」應與mgr.empId記錄和mgr.name所以很清楚。

其次,我不喜歡加入名稱部分。您應該將其轉換爲ID。 (有人結婚,你知道接下來的事情你有一堆孤兒......)我懷疑是不是真的需要這個表。第三,結果集中的2列具有相同名稱(名稱)的事實可能會導致後續問題 - 如果沒有其他問題,則會導致問題。

這是SQL我會用:

SELECT emp.Name, '(none)' AS Manager 
FROM Employee emp 
WHERE NOT EXISTS (SELECT 1 
    FROM Employee mgr 
    WHERE mgr.empId = emp.mgrId) 

UNION ALL 

SELECT emp.Name, mgr.Name AS Manager 
FROM Employee emp 
JOIN Employee mgr ON emp.mgrId=mgr.empId 
JOIN Name nm ON nm.name = mgr.Name 
ORDER BY 1, 2 

不要擔心,如果這看起來效率不高,現代SQL編譯器在大多數情況下,同樣的事情,無論你如何寫它結束了。

但首先,我要運行這個SQL,看看我有沒有記錄在名稱表和解決這些問題的任何員工:

SELECT * 
FROM Employee e 
LEFT JOIN Name nm 
ON nm.name = e.Name 
WHERE nm.name is null