2011-01-07 55 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。在这种情况下,子查询可能很有用