查询孤立关系

时间:2015-04-23 19:53:11

标签: sql postgresql

我必须在使用OmniAuth的Rails应用程序中清除孤立关联。为简单起见,这是一个精简的场景。

给出两个表:

users:
  password_id: INTEGER
  <more columns>

passwords:
  id: INTEGER NOT NULL
  password_digest: VARCHAR 

换句话说:那是一个兼容用户所属的密码&#34;关系。 (有很好的理由说明这种关系不是相反的。)

通常,每个用户都与一个密码相关。但有时会删除用户并且相应的密码会被孤立。

是否有一种有效的方法可以在Postgres上只使用一个SQL查询来查找所有孤立密码(换句话说:所有与任何用户无关的密码)?

感谢您的提示!

3 个答案:

答案 0 :(得分:3)

SELECT p.id FROM PASSWORDS p
WHERE NOT EXISTS ( SELECT 1 FROM users u WHERE p.id = u.password_id );

......是一个直截了当的解决方案。如果您愿意,可以围绕LEFT JOINMINUS构建它。您还可以通过将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