2011-01-07 20 views
0

親子関係(1:n)にある2つのテーブルを検索する必要がありますが、結果セットでは親テーブルのフィールドのみが必要です。これを行う最も意味のある方法は何ですか?それは次の簡単な構成の1つですか...SQL Server:2つのテーブルからデータを取得する実行方法

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]) 

...他にも、より良い可能性がありますか?データはAD.netによって照会されます。

+1

答えはたぶん各テーブルにいくつの行があるかによって決まります... JOINは索引の順序やその他の要素によってはパフォーマンスが向上しますが、 、 小さなデータセットでは、EXISTSがわずかに改善されます。 –

+0

@neil fenwick:JOINでDISTINCTが必要な場合があることを証明できますか? – gbn

+0

@Neil Fenwick:潜在的に、多くの行が返されます(数千)が、ほとんどの場合、わずか数(10〜200)です。 – HCL

答えて

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

+1ありがとうございます。あなたのSELECTのANDをORに変更しました。 。正常に動作します。 – HCL

+0

hehe、あなたは編集に私を打つ:)また、あなたの質問のための有効なものと考えるなら、また、答えを受け入れてください。 – Ronnis

0

なぜ外部結合を使用することを主張していますか。あなたの説明から、結果は親テーブルから得られ、子テーブルは制限の一部としてのみ使用されます。この場合は、内部結合を使用する必要があります。子テーブルが特定の基準で一致しない場合は、結果に表示されません。パフォーマンスは実際には、結合とフィルターの基準を構成するフィールドに来るでしょう。結合(外部キー)のフィールドが索引付けされ、必要に応じてフィルター基準フィールドも索引付けされていることを確認してください。例えばフィルター基準で関数を使用しないでください。ここで、field1> = DATEDIFF(???)です。私はdatediffの正確な構文を忘れています。これは、完全なデータセットの各行に対してdatediffが評価されることを意味します。このような場合、サブクエリは役に立ちます

+0

子テーブルのレコードが見つからない場合は、親テーブルの結果も必要です。だから私はOUTER JOINを作ったのです。 – HCL

関連する問題