Postgresql 查询表中没有外键指向的行
假设我们的数据库中有两个表 表1: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
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)
这种类型的联接称为左反联接,即执行左外部联接并仅查找不匹配的行。