Postgresql 查询表中没有外键指向的行

Postgresql 查询表中没有外键指向的行,postgresql,sqlalchemy,Postgresql,Sqlalchemy,假设我们的数据库中有两个表 表1: Employer: id name 表2: Employee: id name employer_id 我的目标是找到一个相对高效的查询,以查找所有没有员工的雇主。我认为实现这一点的唯一方法是使用子查询,但我认为应该有一种使用联接的方法 以下是我最初拥有的: SELECT * FROM employer WHERE employer.id NOT IN ( SELECT employer_i

假设我们的数据库中有两个表

表1:

Employer:
    id
    name
表2:

Employee:
    id
    name
    employer_id
我的目标是找到一个相对高效的查询,以查找所有没有员工的雇主。我认为实现这一点的唯一方法是使用子查询,但我认为应该有一种使用联接的方法

以下是我最初拥有的:

SELECT * FROM employer
    WHERE employer.id NOT IN (
         SELECT employer_id FROM employee
    );
由于我在网上找不到这方面的任何答案,我的解决方案在下面的答案中(无可否认,有一位同事提供了大量帮助)。我正在使用postgres 9.3和sqlalchemy 0.8

SELECT * FROM employer 
    LEFT OUTER JOIN employee ON employee.employer_id = employer.id 
    WHERE employee.id IS NULL;
对于那些不熟悉外部联接的人(在此之前我没有),此查询将返回所有雇主/雇员对,并返回所有没有雇员的雇主。这些将与“虚拟”员工行配对,所有值均为空。因此,使用员工ID过滤掉所有结果将只剩下没有员工的雇主

(如果有人能给出更好的解释,请尽一切努力。)

在炼金术中:

session.query(Employer).outerjoin(
    Employer.id==Employee.employer_id
    ).filter(Employee.id==None)

这种类型的联接称为左反联接,即执行左外部联接并仅查找不匹配的行。