簡體   English   中英

如何選擇外表中沒有匹配的記錄(左外連接)

[英]How to select records with no matches in the foreign table (Left outer join)

我有一個表可以保存我的資源:

資源| 的ressource-ID

還有一個包含關聯的表

Ressource-ID | 員工ID

如何選擇可用的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 JOINLEFT OUTER JOIN )放到resource_idemployee_id匹配的查詢中在resource_idresources表和employee_idemployees (分別)表。 然后,添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM