2017-03-17 66 views
0

我在PostgreSQL上有兩個表格,分別是:僱員僱主。 每個表中都有數據。顯示在PostgreSQL上查詢JOINING值缺失的所有結果

Columns in employees: employee_id, employee_name, employer_id. 

Columns in employers: employer_id, employer_name. 

我想顯示沒有締合employer_name所有employee_name的。

我用下面的查詢:

SELECT DISTINCT a.employee_name, b.employer_name 
    FROM employees a 
    NATURAL JOIN employers b 
    WHERE a.employee_name LIKE 'Jack'; 

NB! 我也嘗試添加在下面我查詢: COALESCE(b.employer_name, '') = ''

問題: 如果在包含關聯EMPLOYEE_ID僱主表中沒有記錄,查詢的所有返回任何內容。我假設這是因爲兩張桌子沒有什麼可以加入的......但我想至少找到所有沒有僱主的員工。我希望我的結果中的employer_name值能夠返回:blank /''/ NULL。

非常感謝您的協助。

+0

使用OUTER/RIGHT加入。如果連接表中沒有任何記錄,您將在外部/右邊表上獲得一個空值的連接結果 – Sharky

回答

1
select employees.employee_name ,employers.employer_name 
from employees 
left join employers 
on employees.employee_id = employees.employee_id 
where employers.employer_name is NULL 
0

使用LEFT JOIN

SELECT a.employee_name, 
     COALESCE(b.employer_name, 'NA') AS employer_name 
FROM employees a 
LEFT JOIN employers b 
    ON a.employer_id = b.employer_id 
WHERE b.employer_id IS NULL 

您當前的查詢有幾個問題,其中第一個就是你使用的是NATURAL JOIN,其行爲應該鏈接一個INNER JOIN,丟棄員工記錄不匹配任何僱主。相反,通過使用LEFT JOIN,我們可以保留所有員工記錄,而不管他們是否有僱主。 WHERE子句檢查連接表中的NULLNULL指示員工與任何僱主都不匹配。

0

您的表名employees表有點奇怪,國際海事組織。有一種設計的「經驗法則」,表示一個表格模擬實體或實體之間的關係,但不是兩者。爲了證明這種奇怪,考慮關係操作是

employees MINUS employers 

......這表明某些東西是關閉的。

此設計問題的另一個症狀是employees表中的employer_id必須具有某種佔位符才能表示謂詞employee has no employer,可能爲null(並且應避免空值IMO)。

我建議你通過引入第三個表來模擬員工與其僱主之間的關係來修復這個設計。這裏存在另一個設計問題:不應該將這個新的表命名爲employees?換句話說,是不是僱員的僱員的定義是什麼?

考慮這樣的設計來代替:

People: person_id, person_name 
Employers: employer_id, employer_name 
Employees: employer_id, person_id 

找到誰不是僞關係符號職工人的名字:

People MINUS Employees { person_name } 

SQL是相當多的更詳細:

SELECT DISTINCT person_name 
    FROM People 
     NATURAL JOIN 
     (SELECT person_id FROM People 
     EXCEPT 
     SELECT person_id FROM Employees) t; 

請注意您的原始查詢不必要地使用範圍變量abNATURAL JOIN的好處之一是重複列名的消除。範圍變量與NATURAL JOIN總是看起來很奇怪!

+0

Hi @onedaywhen,這是一個例子,我使用的表名和信息是不同的,只是發佈了一個簡單的例子。儘管如此,謝謝你的建議。 – FireHawk2300