我在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。
非常感谢您的协助。
答案 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
子句检查联接表中的WHERE
,NULL
表示该员工与任何雇主都不匹配。
答案 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;
请注意,原始查询不必要地使用范围变量a
和b
。 NATURAL JOIN
的一个好处是重复列名称的消除。 NATURAL JOIN
的范围变量对我来说总是很奇怪!