2016-09-28 12 views
1

もっと効率的な書き方がありますか?これを実装する最良の方法であるかどうかはわかりません。または条件との結合

select * 
from stat.UniqueTeams uTeam 
Left Join stat.Matches match 
on match.AwayTeam = uTeam.Id or match.HomeTeam = uTeam.id 
+0

クエリで 'EXPLAIN'を実行して、実際にSQL Serverが実行していることを確認しましたか?私は、単一の 'OR'条件でインデックスを使うことは可能だと思います。 –

+0

あなたは背中にパットが必要です。ああ、申し訳ありませんが、私が意味する... あなたは背中にupvoteに値する – toha

+0

uTeam.Id IN(match.AwayTeam、match.HomeTeam) –

答えて

3

や結合でMSSQLはritgh方法でインデックスを使用することはできませんbecase、悪い習慣です。 より良い方法 - UNIONを持つ2つの選択を使用します。LEFTを使用している間に注意する

SELECT * 
FROM stat.UniqueTeams uTeam 
LEFT JOIN stat.Matches match 
ON match.AwayTeam = uTeam.Id 
UNION 
SELECT * 
FROM stat.UniqueTeams uTeam 
LEFT JOIN stat.Matches match 
ON match.HomeTeam = uTeam.id 
+0

すごく、サー。私はこれに気づくでしょう – toha

+0

@ toha私の答えを正しいものとしてマークすることができますか、何かを追加する必要がありますか? – Backs

+0

私はTSではありません。他のユーザーの質問 – toha

0

物事は、クエリに参加:すべての

1)まず、参加残すことができNULL(複数可)を導入することができますNULLはサーバーエンジンによって別々に処理されるため、パフォーマンス上の問題が発生します。

2)ヌル可能なテーブルは大量にしてはいけません。それ以外の場合は、実行するにはコストがかかります(パフォーマンス+リソース)。

3)すでに索引付けされている列を含めるようにしてください。そうでなければ、最初により良い列を含める必要がある場合は、それらの列のインデックスを作成します。

あなたのケースでは、同じテーブルの2つの列が別のテーブルに結合されたままになります。私は以下が示されているよう必要なデータの同じ列を持つ単一のテーブルを持つことができるのであれば、この場合には良い方法は次のようになります。

; WITH Match AS 
(
-- Select all required columns and alise the key column(s) as shown below 
    SELECT match1.*, match1.AwayTeam AS TeamId FROM stat.Matches match1 
    UNION 
    SELECT match2.*, match2.HomeTeam AS TeamId FROM stat.Matches match2 
) 
SELECT 
    * 
FROM 
    stat.UniqueTeams uTeam 
    OUTER APPLY Match WHERE Match.TeamId = uTeam.Id 

私がOUTERを使用していたJOINをLEFT OUTERとほぼ類似している適用されますが、クエリの実行中は異なります。これは、あなたのケースでよりよく実行できるテーブル値関数として機能します。