如何在表中查找与另一个表中的所有记录相关的记录

时间:2011-07-16 14:59:34

标签: sql tsql

我有三张桌子:

  • 酒吧
  • FooBar的

FooBar是一个关系表,其中包含彼此相关的FooBar的集合,它只有两列(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变量中,这样它就不会每次执行,但这是我到目前为止唯一可以考虑的优化。

1 个答案:

答案 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)