显示缺少JOINING值的PostgreSQL上查询的所有结果

时间:2017-03-17 05:35:16

标签: sql postgresql join

我在PostgreSQL上有两个表,即:员工雇主。 每个表中都有数据。

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。

非常感谢您的协助。

3 个答案:

答案 0 :(得分:1)

.test1 {
  float: left;
  background-color: yellow;
  padding: 10px;
}

答案 1 :(得分:0)

使用 {% extends 'layout/main.html' %} {% block title %} {% load staticfiles %} <script type="text/javascript" src="{% static 'fancybox.js' %}"></script> <!-- SOME CONTENT --> {% endblock %}

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子句检查联接表中的WHERENULL表示该员工与任何雇主都不匹配。

答案 2 :(得分:0)

您的表名employees表有点奇怪,IMO。有一种设计“经验法则”,即表格可以模拟实体或实体之间的关系,但不能同时模拟两者。为了证明这种奇怪性,请考虑关系操作是

employees MINUS employers

...这表明某些事情已经结束。

此设计问题的另一个症状是employer_id表中的employees必须有某种占位符来表示谓词employee has no employer,可能是null(并且空值是避免,IMO)。

我建议您通过引入第三个表来模拟员工与雇主之间的关系来修复此设计。这是另一个设计问题:这个 new 表不应该被命名为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的范围变量对我来说总是很奇怪!