説明を簡単にするために、メンバーテーブルとメールテーブルを使用します。メールテーブルには、次の構造を有する:ON句が可変のときに2つのテーブルを結合する方法
-------------------------------
FromMember int NOT NULL (FK)
ToMember int NOT NULL (FK)
...
-------------------------------
は、私は彼がFromMemberかToMemberであるかどうかを特定のメンバーのためにすべてのメールを返しますクエリを書きたいです。 WHERE句にOR句を使用するのは簡単です。
しかし、それは複雑になる私は他メンバーのメンバー情報を取得するために、メンバテーブルにメールテーブルに参加したいということです。したがって、私がFromMemberである場合、メンバーテーブルへのジョイン句はToMemberフィールドを使用し、私がToMemberである場合、ジョイン句よりもFromMemberフィールドを使用します。基本的に、ON句は特定の条件に基づいて2つの異なるフィールドと結合する必要があります。それは可能ですか?
SELECT * FROM mail INNER JOIN member ON mail.ToMember = member.MemberID
WHERE mail.FromMember = @me
UNION ALL
SELECT * FROM mail INNER JOIN member ON mail.FromMember = member.MemberID
WHERE mail.ToMember = @me
しかし、私は結果セットが私のコードの多くの場所で使用されるため、ビューでこのクエリを入れたいと思います:
私のソリューションは、これまで次のようにALL UNIONを使用することです。つまり、ユーザー定義の表関数を使用して実装する必要があると考えられるパラメータ化されたビューが必要です。
基本的に、私は2つの答えを探しています:
UNION ALLの代わりにそのクエリを書く方が良いですか?
また、そのクエリをVIEWまたはUDFに配置する必要がありますか?
VIEWが推奨される方法である場合、どのように@meパラメータをVIEWに渡すことができますか。 @me paramをWHERE節に移動することはできません。なぜなら、WHERE節はON節に依存しているからです。 WHERE句を引き出し、それらをOR演算しても、上記のUNION ALLクエリと同じ結果セットは返されません。
UNION ALLを含むビューを作成できます。何故なの? – JotaBe
**解答の中で「OR」を示唆している人は、インデックスを使用せずにテーブル全体をスキャンするだけです**これは行の数や回数に応じて痛いものになる可能性がありますこのクエリが実行されます。 'UNION'を使用すると、' FromMember'と 'ToMember'の両方でインデックスヒットが可能になります(存在すれば)。私の経験では、ほとんどの場合、インデックスを使用することはテーブルスキャンよりもずっと速くなります。 –
@KM:上記の "OR"文はINNER JOIN ON句のOR句にも適用されますか? @quazaryによって以下の答えで指定されているように? – Cristina