2011-07-16 48 views
0

相關的所有記錄表中的記錄我有三個表:如何找到了在另一臺

  • 酒吧
  • FooBar的

FooBar的是一個關係表中包含彼此相關的Foo s和Bar s的集合,它只有兩列(FooId,BarId)。

到目前爲止我的代碼用於獲取,涉及到所有的Bar出去了所有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放在外部select之外的SQL變量中,因此它不會每次都執行,但這是我迄今爲止唯一可以考慮的優化。

+0

請問這是什麼程序的目的是什麼?我讀了標題,它隱約提醒我這個問題:http://stackoverflow.com/questions/3877178/using-god-to-monitor-unicorn-start-exited-with-non-zero-code-1 – IDWMaster

+0

也許這是值得改變學科領域? –

+0

其實你的查詢提供了很好的執行計劃,我不用擔心。 – Magnus

回答

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) 
+0

,解決了如果存在「女孩記錄」的解決方案,但是當你想要所有匹配的女孩記錄時,情況如何呢? –

+0

@ hamlin11,看我的答案。 –

+0

@polishchuk感謝您的評論,但對於大量的數據(BoyGirl計數超過3.000.000)這是非常緩慢(例如:43秒) –

相關問題