我有一张桌子:
这个users表:
因此每个用户都与relationships表中的另一个用户配对。
现在我想在两列(relationshipsusers)中的任何一列中获取一个不在relationships表中的user_id列表。
我怎么能写那个查询呢?
第一次尝试:

SELECT users.id
FROM users
LEFT OUTER JOIN relationships
ON users.id = relationships.user_id
WHERE relationships.user_id IS NULL;

输出:
这应该只显示2个结果:5和6。结果8是不正确的,因为它已经存在于pair_id。当然,我知道查询不正确,我该如何修复它?
我在用PostgreSQL。

最佳答案

您需要比较on语句中的两个值:

SELECT u.id
FROM users u LEFT OUTER JOIN
     relationships r
     ON u.id = r.user_id or u.id = r.pair_id
WHERE r.user_id IS NULL;

一般来说,or子句中的on可能是低效的。我建议用两个not exists语句替换它:
SELECT u.id
FROM users u
WHERE NOT EXISTS (SELECT 1 FROM relationships r WHERE u.id = r.user_id) AND
      NOT EXISTS (SELECT 1 FROM relationships r WHERE u.id = r.pair_id);

关于sql - 如何从一个表中获取相关表中不存在的记录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23933917/

10-10 20:39