質問

以下のように、列の値をそれ自体と比較するマルチテーブル選択クエリがあります。

SELECT * FROM table1 t1,table2 t2
      WHERE t1.col1=t2.col1  --Different tables,So OK.
      AND t1.col1=t1.col1    --Same tables??
      AND t2.col1=t2.col1    --Same tables??

これは私には冗長のようです。私のクエリは、それらを削除することはロジック/パフォーマンスに影響を与えるでしょうか?

前もって感謝します。

役に立ちましたか?

解決

これは冗長であるように思われますが、その唯一の効果は、これらの列にnull値を持つ線を削除することです。これらの条項を削除する前に、列がヌルでないことを確認してください。

列が気付かれない場合は、これらの行を安全に置き換えることができます(読みやすく、メンテナンスしやすい):

  AND t1.col1 IS NOT NULL
  AND t2.col1 IS NOT NULL


ジェフリーのコメントに従って更新します

あなたは絶対に正しいです、私は自分でそれを見なかった方法がわかりません:結合条件 t1.col1=t2.col1 nullではない結合列のある行のみが考慮されることを意味します。条項 tx.col1=tx.col1 したがって、完全に冗長であり、安全に削除できます。

他のヒント

しないでください あなたが影響を理解するまでそれらを削除してください。他の人が指摘しているように、彼らがクエリに影響を与えず、おそらく最適化されている場合、そこに彼らを離れることに害はありませんがそこに 五月 それらを削除する際に害を及ぼしてください。

あなたが何か他のものを壊していないことを確信するまで、働いている何かを修正しようとしないでください。

私がこれに言及する理由は、次の方向に沿って、まさにこの構成要素を持っていたレガシー報告アプリケーションを継承したためです。

where id = id

そして、賢明な仲間であるため、私はそれを捨てましたが、データベースエンジンがクエリを使用している唯一のものではなかったことを発見しました。

それは最初に存在するすべての列を抽出した前プロセッサを通過しました where 節約され、それらが索引付けされたことを確認しました。基本的に自動調整データベース。

さて、ユーザーがアドホッククエリを行っていたときに、データベースが以前の速度のほんの一部に遅くなったときの次の反復に対する私たちの驚きを想像してください。 id 分野 :-)

これは、以前のサポートチームが投入したKludgeであり、一般的なアドホッククエリがインデックス付き列を使用していることを確認しましたが、標準的なクエリのどれもそうしていませんでした。

だから、私はあなたを言っているのではありません できません それをしてください。なぜそれが最初に入れられたのかを理解することをお勧めします。

  1. はい、条件は同一であるため、明らかに冗長です!

    SELECT * FROM table1 t1,table2 t2
    WHERE t1.col1=t2.col1
    
  2. しかし、あなたはそれらの少なくとも1つが必要です。それ以外の場合は、デカルトが接合されています。Table1からの各行は、Table2のすべての行に結合されます。 Table1に100行があり、Table2に1,000行の行があった場合、結果のクエリは100,000の結果を返します。

    SELECT * FROM table1 t1,table2 t2 --warning!
    
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top