Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在一个表中查找与另一个表中的所有记录相关的记录_Sql_Tsql - Fatal编程技术网

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

Sql 如何在一个表中查找与另一个表中的所有记录相关的记录,sql,tsql,Sql,Tsql,我有三张桌子: 福 酒吧 福巴 FooBar是一个关系表,包含相互关联的Foos和Bars的集合,它只有两列(FooId、BarId) 到目前为止,我的代码用于获取与所有条相关的Foo: select f.* from Foo f where f.FooId IN ( SELECT fb.FooId FROM FooBar fb GROUP BY fb.FooId HAVING C

我有三张桌子:

  • 酒吧
  • 福巴
FooBar是一个关系表,包含相互关联的
Foo
s和
Bar
s的集合,它只有两列(FooId、BarId)

到目前为止,我的代码用于获取与所有
条相关的
Foo

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
s的总数放在外部选择之外的一个SQL变量中,这样它就不会每次都执行,但这是迄今为止我能想到的唯一优化。

试试这个,它将返回与所有
Bar
相关的所有
Foo
。它使用
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)

这就解决了如果存在“女孩记录”的问题,但是如果你想要所有匹配的女孩记录呢?@polishchuk谢谢你的评论,但是对于大量的数据(男孩女孩数超过3.000.000),这非常慢(例如时间:43秒)@Matija
其中bg.GirlID为null
需要一个过滤操作,这就是原因。您最初查询的时间是几点?如果它的坏,也许你应该考虑把你的内部查询(需要一些重新排列)在索引视图。@ Daniel DiPaolo,主题区域改变了吗?-)是的,我重新打开并更改了标题以使其更清晰,但是问题看起来很奇怪,所以我继续编辑,使其更通用,然后将您的帖子编辑为Match我可以问一下这个程序的目的是什么吗?我读了这个标题,它模糊地提醒了我这个问题:也许改变主题领域是值得的?事实上,你的查询给出了很好的执行计划,我不会担心。@IDWMaster-我的实际问题可以简化为这个,我只是认为这个标题会比发布和客户的标题获得更多的视图和答案:)