SQL Server:从两个表中获取数据的高效方法

时间:2011-01-07 09:13:32

标签: sql-server sql-server-2005 ado.net

我必须搜索两个父子关系(1:n)的表,但在结果集中我只需要父表的字段。这样做最有意义的方法是什么?它是以下简化结构之一......

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将查询数据。

2 个答案:

答案 0 :(得分: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>);

答案 1 :(得分:0)

为什么要坚持使用外连接。根据您的描述,结果将来自父表,子表将仅用作限制的一部分。在这种情况下,您应该使用内部联接。如果子表与特定条件不匹配,则它不会显示在结果中。性能将真正归结为构成连接和过滤条件的字段。尝试确保对连接(外键)中的字段编制索引,并在必要时对过滤条件字段进行索引。不要在过滤条件中使用函数,例如其中field1&gt; = DATEDIFF(???)。我忘记了datediff的确切语法。这意味着对整个数据集中的每一行评估datediff。在这种情况下,子查询可能很有用