【问题标题】:How to find records in a table that are related to all the records in another table如何在一个表中查找与另一个表中的所有记录相关的记录
【发布时间】:2011-07-16 14:59:34
【问题描述】:

我有三张桌子:

  • 酒吧
  • FooBar

FooBar 是一个关系表,其中包含相互关联的Foos 和Bars 的集合,它只有两列(FooId,BarId)。

到目前为止,我的代码用于获取与所有 Bars 相关的所有 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)
         )

必须有更有效的方式来写这个。我可以将Bars 的总数放在外部选择之外的 SQL 变量中,这样它就不会每次都执行,但这是我迄今为止能想到的唯一优化。

【问题讨论】:

  • 请问这个程序的目的是什么?看了标题,隐约想起了这个问题:stackoverflow.com/questions/3877178/…
  • 也许值得改变学科领域?
  • 其实你的查询给出了很好的执行计划,我不担心。
  • @IDWMaster - 我的实际问题可以简化为这个,我只是假设这个标题会给我带来更多的观点和答案,而不是发布和客户的标题:)

标签: sql tsql


【解决方案1】:

试试这个,它将返回与所有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 感谢您的评论,但对于大量数据(BoyGirl 计数超过 3.000.000),这非常慢(例如时间:43 秒)
  • @Matija where bg.GirlID is null 需要过滤操作,这就是原因。您原始查询的时间是几点?如果它不好,也许您应该考虑将您的内部查询(需要重新排列)放在索引视图中。
  • @Daniel DiPaolo,主题区域已更改? :-)
  • 是的,我重新打开然后更改了标题以使其更清晰,但是问题看起来很奇怪,所以我继续编辑它以使其更通用,然后编辑您的帖子以匹配跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
  • 2020-06-20
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
相关资源
最近更新 更多