我有一张桌子 Foo
FOO
-------
id
name
BAR
-------
id
name
FOO_BAR_XREF
-------
foo_id
bar_id
我需要选择所有 FOO 实例,其中 foo.id 在 foo_bar_xref 中有一个 bar_id 为 1 的记录,并从 foo 中排除记录,其中 foo.id 有一个记录 n foo_bar_xref 的 bar_id 为 2
foo -> foo_bar_xref 是一对多 *强调文本*foo_bar_xref 可能包含每个 foo_id 的多个 bar_id
这是否可能只使用连接,还是我需要在 where 子句中使用 not exists 语句?
到目前为止我有
select f.name from FOO f
inner join FOO_BAR_XREF fb_1 on fb_1.foo_id = f.id
inner join FOO_BAR_XREF fb_2 on fb_2.foo_id = f.id
where fb_1.bar_id = 1 and fb_2.bar_id <> 2
group by f.name -- remove dupes - running on sql server and is paged with sql servers hackish over keyword where distinct doesn't work so well.
那不是过滤掉 bar 为 2 的 foo
这似乎有效,但我不确定它是最有效的
select f.name from FOO f
inner join FOO_BAR_XREF fb_1 on fb_1.foo_id = f.id and fb_1.bar_id = 1
left outer join FOO_BAR_XREF fb_2 on fb_2.foo_id = f.id and fb_2.bar_id = 2
where fb_2.bar_id is null
group by f.name -- remove dupes