我有一张桌子:
这个users
表:
因此每个用户都与relationships
表中的另一个用户配对。
现在我想在两列(relationships
或users
)中的任何一列中获取一个不在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/