2017-03-17 65 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