2011-08-19 31 views
-2

我有兩個表,父(#tableA)和兒童(#tableB)最佳SQL查詢來獲取存在於所有家長共同子女

在下面的腳本 給予我需要獲得這只是一個紀錄例如'C3',它是P1,P2和P3的常見孩子。

我只能想到下面的這個方法。

Create table #tableA (PkCol varchar(3)) 
Create table #tableB (FkCol varchar(3), FKChild varchar(10)) 

Insert Into #tableA 
Select 'P1' union 
Select 'P2' union 
Select 'P3' 

Insert Into #tableB 
Select 'P1', 'C1' union 
Select 'P1', 'C2' union 
Select 'P1', 'C3' union 
Select 'P2', 'C3' union 
Select 'P2', 'C4' union 
Select 'P2', 'C5' union 
Select 'P3', 'C3' union 
Select 'P3', 'C6' union 
Select 'P3', 'C7' 

Select tb.FKChild from #tableA ta Inner Join #tableB tb on tb.FkCol = ta.PkCol 
Group By tb.FKChild 
Having Count(Distinct ta.PkCol) = (Select Count(*) from #tableA) 

Drop table #tableA 
Drop table #tableB 

有沒有更好的方式來做到這一點是乾淨的,當實際父表已經接近1K記錄和子表有說接近200多萬條記錄,不會影響性能?

回答

0

首先檢查您的查詢計劃。 如果你很確定,這些表的比例是像你描述1K:2M,和您的查詢計劃說別的東西,你可以添加的提示,這裏描述的加盟: http://msdn.microsoft.com/en-us/library/ms173815%28v=SQL.90%29.aspx

如果兩個表適合memmory,請嘗試使用哈希聯接,如果不是去循環聯接(基於查詢):

Select tb.FKChild from #tableA ta Inner Loop Join #tableB tb on tb.FkCol = ta.PkCol 
Group By tb.FKChild 
Having Count(Distinct ta.PkCol) = (Select Count(*) from #tableA) 

不過請注意,如果您不確定的數據比,離開查詢計劃由sql server選擇,因爲如果你強迫使用不正確類型的連接,它可能會影響你的性能。