2011-01-07 59 views
0

我必須在兩個父 - 子關係(1:n)表中搜索,但在結果集中,我只需要父表的字段。什麼是最有意義的方式來做到這一點?它是以下簡化結構之一...SQL Server:從兩個表獲取數據的高性能方式

SELECT parent.fields FROM parent LEFT OUTER JOIN child ON [JoinExpr] 
    Where [ParentFilter] OR [ChildFilter] GROUP BY parent.fields 

SELECT DISTINCT(parent.fields) FROM parent LEFT OUTER JOIN child ON [JoinExpr] 
    Where [ParentFilter] OR [ChildFilter] 

SELECT parent.fields FROM parent Where [ParentFilter] 
    OR parent_id IN(SELECT parent_id FROM child WHERE [ChildFilter]) 

......還是有其他更好的可能性嗎?數據將由ado.net查詢。

+1

答案可能取決於您在每個表中有多少行...... JOIN的傾向於比大型數據集更好地執行(取決於索引順序和其他因素) , WHERE EXISTS可能對小數據集執行略微更好 – 2011-01-07 09:23:04

+0

@neil fenwick:您能否證明,考慮到事實上您可能需要DISTINCT加入? – gbn 2011-01-07 09:26:45

+0

@Neil Fenwick:可能有很多行返回(幾千),但在大多數情況下,只有少數(10到200) – HCL 2011-01-07 09:43:53

回答

3
select parent.fields 
    from parent 
where <filters on parent columns> 
    OR exists(
     select 'x' 
      from child 
      where child.parent_id = parent.parent_id 
      and <filters on child columns>); 
0

你爲什麼要堅持使用外連接。根據描述,結果將來自父表,並且子表僅用作限制的一部分。在這種情況下,你應該使用內部連接。如果子表不符合特定條件,則不會顯示在您的結果中。性能將真正歸結爲構成連接和過濾條件的字段。嘗試確保連接(外鍵)中的字段已編入索引,並在必要時還對過濾條件字段進行索引。不要在過濾條件中使用函數,例如where field1> = DATEDIFF(???)。我忘記了datediff的確切語法。這將意味着對於整個數據集中的每一行都會評估datediff。在這種情況下,子查詢可能很有用