9

古いスタイルの構文を使用してクエリを新しい結合構文に変換するのに忙しいです。私のクエリの本質は次のとおりです。

元のクエリ

SELECT i.*  
FROM 
  InterestRunDailySum i, 
  InterestRunDetail ird, 
  InterestPayments p
WHERE 
   p.IntrPayCode = 187
   AND i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode
   AND ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode

新しいクエリ

SELECT  i.*
  FROM InterestPayments p
    INNER JOIN InterestRunDailySum i 
      ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode)
    INNER JOIN InterestRunDetail ird 
      ON (ird.IntRunCode = p.IntRunCode AND ird.IntRunCode = p.IntRunCode)
  WHERE 
    p.IntrPayCode = 187

この例では、「元のクエリ」は46行を返し、「新しいクエリ」は800を超える行を返します。

誰かが私に違いを説明できますか?これらのクエリは同じだと思います。

4

2 に答える 2

19

問題は への参加にありますInterestRunDetail。あなたはIntRunCode2回参加しています。

正しいクエリは次のとおりです。

SELECT  i.*
  FROM InterestPayments p
    INNER JOIN InterestRunDailySum i 
      ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode)
    INNER JOIN InterestRunDetail ird 
      ON (ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode)
  WHERE 
    p.IntrPayCode = 187
于 2012-06-22T14:24:00.390 に答える
6

「新しいクエリ」は、JOIN の現在の ANSI SQL 標準と互換性のあるものです。

また、クエリ #2 がよりクリーンであることがわかります。

  • 2 つのテーブル間の結合条件を考えて指定する必要がほとんどあります。クエリに誤ってデカルト積が含まれることはありません。WHEREたまたま 10 個のテーブルをリストし、節に 6 つの結合条件しかない場合、予想よりも多くのデータが返されます。

  • あなたのWHERE句は結合条件で雑然としていないので、よりきれいで、乱雑でなく、読みやすく、理解しやすいです

  • JOINのタイプINNER JOIN( , LEFT OUTER JOIN,かどうかCROSS JOIN) は、スペルアウトするため、通常ははるかに見やすくなります。「古いスタイル」の構文では、これらの結合タイプの違いはわかりにくく、多くのWHERE基準のどこかに埋もれています.....

機能的には、この 2 つは同一です。#1 は、遅かれ早かれ一部のクエリ エンジンによって非推奨になる可能性があります。

また、Aaron Bertrand の優れたBad Habits to Kick (古いスタイルの JOIN 構文を使用したブログ投稿) も参照してください。詳細については、 「悪い習慣をキックする」投稿をすべて読んでください。すべて非常に価値があります。

于 2012-06-22T14:24:35.880 に答える