下面是我創建并在其中插入值的表:
CREATE TABLE employees
(
employeeID int,
employeeName varchar(25),
managerID int,
hireDate date
)
INSERT INTO employees VALUES (1, 'James' , NULL, '2016-01-01'),
(2, 'John' , 1, '2015-02-01'),
(3, 'Robert' , 1, '2015-05-01'),
(4, 'Michael', 2, '2016-06-01'),
(5, 'William', 2, '2015-01-01'),
(6, 'Richard', 3, '2015-01-01'),
(7, 'Charles', 3, '2015-03-01'),
(8, 'Thomas' , 3, '2016-07-01')
GO
SELECT * FROM employees

從上面的截圖可以看出,經理是詹姆斯的約翰比詹姆斯早 11 個月開始作業。您還可以看到,同樣在詹姆斯管理下的羅伯特比詹姆斯早 8 個月開始作業。
現在的問題是:
撰寫一個查詢,顯示比他們的經理至少早 6 個月開始作業的員工。
因為,我正在處理一個表,我發現我需要使用 SELF JOIN。
這就是我嘗試過的:
SELECT E.employeeName
FROM employees E
LEFT JOIN employees M ON E.managerID = M.employeeID
AND E.hireDate > M.hireDate
AND DATEDIFF(MONTH, E.hireDate, M.hireDate) >= 6
我得到以下結果:

從上面的螢屏截圖中可以看到,它顯示了所有員工,包括那些在他們的經理之前至少 6 個月沒有加入的員工。
我需要在查詢中進行哪些更改以顯示比其經理至少早 6 個月加入的員工?
uj5u.com熱心網友回復:
使用JOIN代替LEFT JOIN和改變
AND E.hireDate > M.hireDate
到:
AND M.hireDate > E.hireDate
像這樣:
SELECT E.employeeName
FROM employees E
JOIN employees M ON E.managerID = M.employeeID
AND M.hireDate > E.hireDate
AND DATEDIFF(MONTH, E.hireDate, M.hireDate) >= 6
uj5u.com熱心網友回復:
你這里有幾個問題。
首先,您希望員工在他們的經理之前開始作業,因此E.hireDate < M.hireDate,您的做法是錯誤的。
其次,您在此條件上進行外部連接,該條件僅影響連接右側匹配的行 - 這不會過濾任何行,您需要指定where m.EmployeeId is not null
select e.employeeName
from employees e
left join employees m on m.employeeID = e.managerID
and e.hireDate < m.hireDate
and DateDiff(month, e.hireDate, m.hireDate) >= 6
where m.employeeID is not null;
這實際上將聯接變成了內部聯接,因此您只需洗掉left關鍵字
select e.employeeName
from employees e
join employees m on m.employeeID = e.managerID
and e.hireDate < m.hireDate
and DateDiff(month, e.hireDate, m.hireDate) >= 6;
由于您沒有從聯接表中回傳任何資料,因此這有助于更好地表達為存在
select E.employeeName
from employees E
where exists (
select * from employees m
where m.employeeID = e.managerID
and e.hireDate < e.hireDate
and DateDiff(month, e.hireDate, m.hireDate) >= 6
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/451038.html
