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

时间:2014-07-23 21:43:21

标签: postgresql sqlalchemy

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

表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。

1 个答案:

答案 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)
相关问题