我必须在使用OmniAuth的Rails应用程序中清除孤立关联。为简单起见,这是一个精简的场景。
给出两个表:
users:
password_id: INTEGER
<more columns>
passwords:
id: INTEGER NOT NULL
password_digest: VARCHAR
换句话说:那是一个兼容用户所属的密码&#34;关系。 (有很好的理由说明这种关系不是相反的。)
通常,每个用户都与一个密码相关。但有时会删除用户并且相应的密码会被孤立。
是否有一种有效的方法可以在Postgres上只使用一个SQL查询来查找所有孤立密码(换句话说:所有与任何用户无关的密码)?
感谢您的提示!
答案 0 :(得分:3)
SELECT p.id FROM PASSWORDS p
WHERE NOT EXISTS ( SELECT 1 FROM users u WHERE p.id = u.password_id );
......是一个直截了当的解决方案。如果您愿意,可以围绕LEFT JOIN
或MINUS
构建它。您还可以通过将users
的外键添加到passwords
来完全阻止该方案。
答案 1 :(得分:3)
此类查询称为反连接。最简单的方法是:
SELECT p.*
FROM passwords p
LEFT JOIN users u
ON u.password_id = p.id
WHERE u.<primary key field> IS NULL;
另一种选择是@ Politank-Z给出的NOT EXISTS
方法。它们应该具有基本相同的查询计划。
答案 2 :(得分:0)
你试过了吗?
SELECT * 来自密码 我在哪里(不是用户选择password_id)
或者
SELECT please.*
FROM passwords please LEFT JOIN
users u ON p.id=u.password_id
WHERE u password_id IS NULL