2014-06-12 51 views
0

選擇查詢,我得到了3個表:項目員工project_employeeSQL服務器:從多個表

員工

  • ID(INT,PK)
  • 名稱

項目

  • PROJECT_ID(INT,PK)
  • PROJECT_NAME

project_employee

  • PROJECT_ID(INT,PK)
  • EMPLOYEE_ID(INT,PK)

我試圖做的是編寫一個查詢,得到的是不是一個項目的所有員工的ID和名稱,例如項目數9.

所以,我想:

SELECT ID, Name 
FROM [employee], [project_employee] 
WHERE [employee].ID != [project_employee].emp_id AND [project_employee].project_id = 9; 

但我總是得到空的結果,我的邏輯必然會出錯?

+0

它不應該是'[員工] .ID = [project_employee] .emp_id和[project_employee] .project_id = 9',而不是!? –

回答

2

可以使用NOT EXISTS做到這一點:

SELECT u.ID, u.Name 
FROM [User] u 
WHERE NOT EXISTS (SELECT * 
        FROM [project_employee] pe 
        WHERE pe.project_id = 9 
        AND pe.employee_id = u.ID); 
2

而是嘗試這樣的事情,它應該讓你不在的project_id = 9

SELECT u.ID, u.Name 
FROM [User] u 
WHERE u.ID NOT IN (SELECT pe.employee_id 
        FROM [project_employee] pe 
        WHERE pe.project_id = 9); 
2

所有用戶都可以使用LEFT JOIN獲得所需要的數據

select e.id,e.name 
from employee e 
left join project_employee pe 
on e.id = pe.employee_id 
left join projects p 
on pe.project_id = p.project_id 
where p.project_id is null 

(OR)剛左加入project_employee表。假設沒有項目的所有員工都是期望的產出,則沒有檢查條件。

select e.id,e.name 
from employee e 
left join project_employee pe 
on e.id = pe.employee_id 
where pe.project_id is null 
+0

爲了獲得結果,不需要使用表格「項目」。此外,這隻會返回一個沒有名字的項目中的員工,因爲'project_employee'表只能有非空條目,因爲所有的字段都在主鍵中,並且可能在'project_id'上有一個外鍵。即對於'project_employee'中的每個項目,'projects'中都有一個記錄。 –

+0

@ OlivierJacot-Descombes,這是即使OP想要獲取project_name也能工作的漏洞查詢。我沒有檢查「project_id = 9」的情況,因爲這可能不是OP在後面提到的「示例」(可能他想讓所有員工沒有項目)中提到的意圖。 – Rahul

+0

由於內部連接查詢只會返回具有項目的員工,所以查詢無論如何都是錯誤的。 –

2
SELECT ID, NAME 
FROM employee e 
LEFT JOIN project_employee pe 
    ON pe.employee_id = e.id 
     AND pe.project_id = 9 
WHERE pe.employee_id IS NULL 

你甚至都不需要項目表,因爲你是不是在找一個項目的員工。

+0

OP要求不在**特定**項目中的員工。例如項目編號9,他說。 –

+0

好的,加了一個特定的一個,仍然不必全部使用3個表格。 –

1

他要求檢查員工是否不在特定項目中的能力。 不在解決方案是好的,但我通常更喜歡使用左連接。

SELECT ID, NAME 
FROM employee e 
LEFT JOIN project_employee pe 
    ON pe.emp_id = e.id 
    and pe.project_id = 9 
WHERE pe.employee_id IS NULL