我有三张桌子:
FooBar是一个关系表,其中包含彼此相关的Foo
和Bar
的集合,它只有两列(FooId,BarId)。
到目前为止,我的代码用于获取与所有Foo
相关的所有Bar
:
select
f.*
from
Foo f
where
f.FooId IN
(
SELECT fb.FooId
FROM FooBar fb
GROUP BY fb.FooId
HAVING COUNT(*) = (SELECT COUNT(*) FROM Bar)
)
必须有更有效的方式来写这个。我可以将Bar
的总数放在外部选择之外的SQL变量中,这样它就不会每次执行,但这是我到目前为止唯一可以考虑的优化。
答案 0 :(得分:1)
试试这个,它会返回与所有Foo
相关的所有Bar
。它使用exists
运算符:
select *
from @Foo f
where not exists(
select 1
from @Bar b
left join @FooBar fb on fb.BarID = b.ID and fb.FooID = f.ID
where fb.FooID is null
)
示例数据:
declare @FooBar table(BarID int, FooID int)
insert @FooBar values(1,1), (2,1), (3,1), (1,2), (2,2), (1,3), (2,3), (3,3)
declare @Bar table(ID int)
insert @Bar values(1), (2), (3)
declare @Foo table(ID int)
insert @Foo values(1), (2), (3)