我有示例数据库,我存储男性和女性之间的关系。架构和一些数据显示在图像上。
有没有办法选择所有不属于BFF关系的男人? 例如,答案将是 Bob,Charlie和Nick 。
我认为,实际上我是从A表中选择数据而没有来自B表的数据(有一些条件)。有没有办法实现这个?
答案 0 :(得分:2)
此类问题表明not exists
。棘手的部分是not exists
子查询有一个连接:
select m.*
from man m
where not exists (select 1
from man_women_relationship mwr join
type t
on mwr.fk_type = t.id
where mrw.fk_man = m.id and t.name = 'BFF'
);
答案 1 :(得分:1)
我是sql的新手,所以我可能错了。但这就是我想要的:
从Man_Women_Relationship连接中选择姓名输入Man_Women_Relationship.FK_Type = Type.ID AND Type.ID = 4
答案 2 :(得分:1)
子查询可能很慢而且难以阅读。您可以使用外部联接来避免使用子查询:
SELECT Man.*
FROM Man
JOIN Man_Woman_Relationship mwr ON Man.ID = mwr.FK_Man
LEFT JOIN Type ON mwr.FK_Type = Type.ID AND Type.Name = 'BFF'
WHERE Type.Name IS NULL
这将使你们所有处于关系中而不是处于BFF关系中的男人。为了包括不在任何关系中的男性,您还需要LEFT JOIN
关系表:
SELECT Man.*
FROM Man
LEFT JOIN Man_Woman_Relationship mwr ON Man.ID = mwr.FK_Man
LEFT JOIN Type ON mwr.FK_Type = Type.ID AND Type.Name = 'BFF'
WHERE Type.Name IS NULL