2012-01-27 8 views
0

次のSELECTクエリを最適化する方法があるかどうかは疑問です。 (注:存在しないテーブルの質問を書くときに入力しましたが、正しい構文がない可能性があります)。SQL Serverでケーステストを最適化する

目標は、Table2に関連する行が含まれている場合、3番目の列の値を数値表2の関連する行のそれ以外の場合、Table3に関連する行が含まれている場合、その列をTable3の関連する行の数に設定します。そうでなければ、私は基本的に(2つのケースで)二度同じクエリを実行していたという事実が好きではありません0

SELECT Id, Title, 
    CASE 
     WHEN EXISTS (SELECT * FROM Table2 t2 WHERE t2.RelatedId = Table1.Id) THEN 
      (SELECT COUNT(1) FROM Table2 t2 WHERE t2.RelatedId = Table1.Id) 
     WHEN EXISTS (SELECT * FROM Table3 t3 WHERE t3.RelatedId = Table1.Id) THEN 
      (SELECT COUNT(1) FROM Table3 t3 WHERE t3.RelatedId = Table1.Id) 
     ELSE 0 
    END AS RelatedCount 
    FROM Table1 

に列の値を設定します。一度だけクエリを実行しながら私が望むことをする方法はありますか?

これは複数のJOINUNIONが含まれているはるかに大きなクエリの一部ですので、まったく別の方法をとることは容易ではありません。

答えて

1

このクエリの方がはるかに優れています。同じクエリを2回実行するだけではありません。相関サブクエリであるため、1行につき1回実行されます。

SELECT Id, Title, 
    coalesce(t2.Count, t3.Count, 0) AS RelatedCount 
    FROM Table1 t 
left outer join (
    SELECT RelatedId, count(*) as Count 
    FROM Table2 
    group by RelatedId 
) t2 on t1.Id = t2.RelatedId 
left outer join (
    SELECT RelatedId, count(*) as Count 
    FROM Table3 
    group by RelatedId 
) t3 on t1.Id = t3.RelatedId 
+0

私はこれを理解しようとしています。 'RelatedId'に参加しているので、これによって' GROUP'の利点は何ですか?また、なぜ 'JOIN'を使うのですか?単純に 'COUNT(*)'を別々の列として持つのと同じではないでしょうか? –

+0

@JonathanWood 'GROUP BY'は' RelatedId'ごとにいくつのレコードを数えることができます。私はあなたの第二の文に従わない。例? – RedFilter

+0

私はそれを得ると思います。 'COUNT'が適用される前にグループ分けされているので、' ON'節は私たちが望む合計を返します。 T-SQLは私の最初の言語ではなく、ちょうど私には奇妙に見えました。いくつかのテストを実行しています... –