3

これら2つのクエリの違いは何ですか?さまざまな構文のあいまいさを解明できなかったため、ANSI構文の時流に乗ることに抵抗してきました。

1)結合の積を返し、その後、重みが500以上の結合されたレコードを除外しますか?そして、2)参加前にそれらを除外していますか?

2つの構文は間違っていますか?なぜ私はそれを使うのでしょうか?

1:

SELECT SOMETHING
FROM FOO
INNER JOIN BAR
ON FOO.NAME = BAR.NAME
WHERE BAR.WEIGHT < 500

2:

SELECT SOMETHING
FROM FOO
INNER JOIN BAR
ON FOO.NAME = BAR.NAME AND BAR.WEIGHT < 500
4

6 に答える 6

5

1)結合の積を返し、次に重みが500以上の結合されたレコードを除外しますか?2)結合前のレコードを除外しますか?」

論理的には、2)は、結合の前ではなく、結合の一部としてフィルターを適用していることを除いて、trueです。ただし、内部結合の場合、この区別はクエリの最終結果セットには影響しません。外部結合、otohの場合、この区別によって結果変わる可能性があります。

:単語を論理的に使用すること(これは、クエリプロセッサがこれらのステップを論理的に実行するシーケンスであると言うこと)は重要であり、文字通りの意味です。プロセッサによって使用される実際のシーケンスは、この論理記述に準拠している場合と準拠していない場合があります。クエリの結果が、プロセッサがこれらの手順をこの順序で実行したかのように表示されることが保証されているだけです...

于 2010-06-09T19:32:52.263 に答える
3

であるため、出力は同じinner joinであり、クエリプランは同じである必要があります。#1の構文は、joining句をfilter句から分離しているため、読みやすくなっています。ONこれにより、フィルター句が混在している場合に発生するノイズが減少するため、大きなクエリを読み取るときに句を再確認するのが簡単になります。

を行うときouter joins、これはもはや好みの問題ではありません-どこに置くBAR.WEIGHT < 500かは出力に直接影響します。

于 2010-06-09T19:27:45.820 に答える
3

違いが生じるのは、外部結合がある場合で、クエリから異なる結果が得られます。

理由の説明については、http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOINを参照してください。

于 2010-06-09T19:32:20.187 に答える
0

WHERE条項の条件は、最終結果セットに適用されます。

句の条件はON、結合された操作にのみ適用されます。

したがって、最終的な結果セットと結合操作の条件を特定し、それらを適切な場所に追加します。

INNER JOIN違いがない場合は、すべての内部結合操作が最終結果セットを担当するためです(外部結合操作には当てはまりません)。outer joinしたがって、これはケースにとって深刻な問題です。

適切な場所に条件を追加すると、次のような追加の利点があります。

  1. メンテナンス可能
    • inner joinからへの変更が簡単outer joinです。状態の心配はありません。
    • クエリから結合テーブルを簡単に削除できます。
    • アプリケーション固有の条件を簡単に変更できます。つまり、参加条件はすべてのシナリオで同じです。ただし、アプリケーション固有の条件(WHERE条件内)は、シナリオごとに異なる場合があります。
  2. 読み取り可能:テーブル間の関係を簡単に識別できます。
于 2010-06-10T03:13:47.837 に答える
0

クエリを見ると、確かに1)と2)のステートメントは正しいようです。ただし、オプティマイザの意見は異なる場合があります。EXPLAIN PLANを介してこれらのクエリを実行し、生成されたプランが実際に異なるかどうかを確認することをお勧めします。

しかし、私は興味があります-どのような構文上のあいまいさがあなたに懸念を引き起こしていますか?何が起こっているのかがはるかに明確であるため、ANSI構文の方がはるかに好きです。

共有してお楽しみください。

于 2010-06-10T01:56:38.010 に答える
0

2つの構文は間違っていますか?なぜ私はそれを使うのでしょうか?

述語をJOIN句またはWHERE句に配置しても、構文的に問題はありません。どちらの方法でもOracleで機能します。Oracleはとにかく実際には気にしません:)

論理的には、JOIN句とWHERE句を使用して、大きくて複雑なクエリをより自己文書化することがあります。例えば:

SELECT dept.name, SUM(emp.salary)
FROM   dept
JOIN   emp
       ON dept.deptno = emp.deptno
          AND emp.commission IS NULL
WHERE  dept.region = :region
GROUP BY dept.name;

このクエリには3つの述語があり、そのうちの1つは結合基準です。emp.commission述語をJOIN句に入れて、これが「交渉不可能」であることを他の開発者に示しました。このクエリのコンテキストでは、述語は常に存在する必要があります。dept.region述部は、それがユーザー指定の基準であることを示すためにWHERE節にあります。

これはスタイルの選択であり、ルールはありません。私はいつもこのようにすることはしません。ただし、クエリが多くのテーブルを結合する場合や、数十の述語がある場合に役立ちます。JOIN句を使用すると、述語を適切に「グループ化」できます。それ以外の場合は、WHERE句を並べ替えて、述語が論理的にグループ化されるようにします。

于 2010-06-10T02:25:23.237 に答える