假设我们的数据库中有两个表。
表1:
Employer:
id
name
表2:
Employee:
id
name
employer_id
我的目标是找到一个相对有效的查询来查找所有没有员工的雇主。我认为这样做的唯一方法是使用子查询,但我怀疑应该有一种方法可以使用JOIN来实现。
这是我原来的:
SELECT * FROM employer
WHERE employer.id NOT IN (
SELECT employer_id FROM employee
);
由于我在网上找不到任何答案,我的解决方案在下面的答案中(无可否认得到了同事的大量帮助)。我正在使用postgres 9.3和sqlalchemy 0.8。
答案 0 :(得分:1)
SELECT * FROM employer
LEFT OUTER JOIN employee ON employee.employer_id = employer.id
WHERE employee.id IS NULL;
对于那些不熟悉外部联接的人(我之前没有),此查询将返回所有雇主/雇员对并返回所有没有雇员的雇主。这些将与" dummy"配对。员工行,所有值均为NULL。因此,使用员工ID过滤掉所有结果将使您只有没有雇员的雇主。
(如果有人能提供更好的解释,请务必。)
在sqlalchemy中:
session.query(Employer).outerjoin(
Employer.id==Employee.employer_id
).filter(Employee.id==None)