[英]How to select records with no matches in the foreign table (Left outer join)
我有一個表可以保存我的資源:
還有一個包含關聯的表
如何選擇可用的Employee的資源,即不在關聯表中?
我試過這個,但它不起作用:
select r.ress, r.ress_id
FROM Ressource r
LEFT outer JOIN Ressource_Employee_Association a ON r.ress_id = a.ress_id
WHERE a.emp_id = 'ID00163efea66b' and a.ress_id IS NULL
有任何想法嗎?
謝謝托馬斯
在LEFT JOIN之后應用WHERE子句。 這意味着您當前正在嘗試獲取Ressource_Employee_Association中沒有匹配記錄的結果,但emp_id
等於'ID00163efea66b'
。
但是如果沒有匹配的記錄, emp_id
怎么可能是除NULL
以外的任何東西?
一種選擇是將WHERE子句的一部分移動到連接中......
SELECT
r.ress, r.ress_id
FROM
Ressource r
LEFT OUTER JOIN
Ressource_Employee_Association a
ON r.ress_id = a.ress_id
AND a.emp_id = 'ID00163efea66b'
WHERE
a.ress_id IS NULL
這將列出與員工'ID00163efea66b'
無關的所有資源。
編輯
你的評論意味着你想要的是......
- 列出所有員工的視圖
- 為每個員工列出他們沒有的每個資源
這需要一個列出所有員工的額外表格。
SELECT
*
FROM
Employee
CROSS JOIN
Ressource
WHERE
NOT EXISTS (SELECT * FROM Ressource_Employee_Association
WHERE emp_id = Employee.id
AND ress_id = Ressource.id)
這有用嗎?
select r.ress, r.ress_id
from resource r
where not exists
(
select 1 from ressource_emplyee_association a
where a.emp_id = '...' and a.ress_id = r.ress_id
)
編輯
在此之前,我有以下內容,但根據以下評論進行了更改:
select r.ress, r.ress_id
from resource r
where not exists
(
select top 1 1 from ressource_emplyee_association a
where a.emp_id = '...' and a.ress_id = r.ress_id
)
SELECT *
FROM Ressource
WHERE ress_id IN (
SELECT ress_id,
FROM Ressource
MINUS
SELECT ress_id
FROM Ressource_Employee_Association
WHERE emp_id = 'ID00163efea66b'
);
在寫完我的上述評論之后,看看提出的解決方案:我想我已經對你要做的事情有了更多的了解。
假設資源表中有無限數量的資源,您希望為每個員工選擇未分配的資源(基於資源關聯表中任何特定員工的不存在)。
為了實現這一目標(並獲得全面的員工列表),您需要第3個表格,以便參考完整的員工列表。 您還需要將所有資源CROSS JOIN
連接到員工列表中(假設每個員工都可以訪問每個資源),然后將您的關聯列表LEFT JOIN
( LEFT OUTER JOIN
)放到resource_id
和employee_id
匹配的查詢中在resource_id
在resources
表和employee_id
的employees
(分別)表。 然后,添加where子句,過濾掉將員工分配給資源的所有記錄。 這將為您提供員工可用的資源,這些資源也未注銷。 這是令人費解的,所以希望這個問題可以解釋得更多:
SELECT e.employee_id, e.employee, r.res_id, r.res
FROM employees e
CROSS JOIN resources r
LEFT JOIN assigned_resources ar
ON ar.employee_id = e.employee_id AND r.res_id = ar.res_id
WHERE ar.res_id IS NULL
如果您沒有employees
表,則可以使用分配的資源表來完成相同的操作,但您將僅限於選擇已分配資源的員工。 您需要添加GROUP BY
查詢,因為關聯表中可能存在多個員工定義。 這是查詢的樣子:
SELECT e.employee_id, r.res_id, r.res
FROM assigned_resources e
CROSS JOIN resources r
LEFT JOIN assigned_resources ar
ON ar.employee_id = e.employee_id AND r.res_id = ar.res_id
WHERE ar.res_id IS NULL
GROUP BY e.employee_id, r.res_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.