2011-11-12 22 views
1

私は3つのテーブルを持つデータベースを持っています。これらのテーブルはメンバーシップ情報を表します。私は、特定のユーザーが属していないグループの結果を検索したいだけです。私はこれを行う方法がわかりません。現在、私は以下を見ています:SQL Server 2008の内部結合と外部結合の混合

SELECT 
    g.*, 
    a.* 
FROM  
    GroupInfo g 
    INNER JOIN [Address] a ON a.[ID]=g.[AddressID] 
    OUTER JOIN [GroupMembership] m ON m.[GroupID]=g.[ID] 
WHERE 
    m.[MemberID]<>@memberID 

私は精度と性能に懸念しています。私は正しい道を進んでいますか?

+0

クエリは、期待するデータを返しますか?クエリ実行プランには何が表示されますか? –

+0

GroupInfoまたはGroupMembershipはどのグループですか?より正確に質問を編集してください。 –

答えて

0

別のアプローチは、私が速かったこれらの2つの方法のかについて疑問を持っていたので、私はテストをコード化

Select * From GroupInfo g Join Address a 
    On a.Id = g.AddressId 
Where Not Exists 
    (Select * From GroupMembership 
    Where GroupID = g.GroupID 
     And MemberID = @memberID) 
0

です。私は2つのテーブルを作成し、最初のテーブルには2番目のテーブルへの外部キーも含まれていました。私はその後、テーブル1に100万エントリを作成し、それらの約半分がテーブル2にリンクされたエントリを作成しました。

その後、ジョインバージョンとサブクエリバージョンの両方を実行しました。両方とも同じ価値観(良い)を思いついた。

興味深いことに、私の悲惨なワークステーションでは、ほぼ同じように約20秒も実行されました。あなたが提案したやり方や別の方法でそれをするかどうかは関係ありません。結合されたテーブルが複数の値を持つ可能性がある場合は、サブクエリにトップ1を追加するほうが高速になると思います。

Select * From GroupInfo g Inner Join Address a 
    On a.Id = g.AddressId 
Where Not Exists 
(Select Top 1 * From GroupMembership Where GroupID = g.GroupID 
    And MemberID = @memberID) 
関連する問題