2

2つのテーブルを結合する場合、以下の2つのブロックの違いは何ですか?どちらがより良いアプローチですか?

パターンA:

SELECT ...
FROM A
    INNER JOIN B
        ON A.PK = B.FK
WHERE 1=1
    AND A.Name = "Foo"
    AND B.Title = "Bar"

パターンB:

SELECT ...
FROM A
    INNER JOIN B
        ON A.PK = B.FK
            AND B.Title = "Bar"
WHERE 1=1
    AND A.Name = "Foo"
4

4 に答える 4

13

これは人それぞれだと思いますが、パターンAの方が良いと思います。

それが行うことは、テーブル レベルの結合をフィルターから分離することです。これは、進行中の 2 つのタイプの結合を明確に分離するため、複数の結合と複数のフィルターを使用するクエリに役立ちます。

于 2009-08-05T16:29:51.780 に答える
4

私はパターンAの方が好みですが、おそらく違いはありません。ただし、実行計画が効率的に実行されていることを確認するには、実際に実行計画を確認する必要があります。

于 2009-08-05T16:30:38.923 に答える
3

に置き換えるINNER JOINOUTER JOIN差が出ます。

それ以外の場合、これらのクエリ:

SELECT  ...
FROM    A
INNER JOIN
        B
ON      A.PK = B.FK
WHERE   A.Name = "Foo"
        AND B.Title = "Bar"

SELECT  ...
FROM    A
INNER JOIN
        B
ON      A.PK = B.FK
        AND B.Title = "Bar"
WHERE   A.Name = "Foo"

SELECT  *
FROM    A, B
WHERE   B.Title = "Bar"
        AND A.Name = "Foo"
        AND A.PK = B.FK

同一です。

OracleMySQLPostgeSQLおよびSQL Serverはそれらをまったく同じように扱い、それらすべてにまったく同じ計画を使用します。

私はこれを使用します:

SELECT  ...
FROM    A
INNER JOIN
        B
ON      B.FK = A.PK
WHERE   A.Name = "Foo"
        AND B.Title = "Bar"

に単一列のキーがB.FKあり、これが次の場合:

SELECT  ...
FROM    A
INNER JOIN
        B
ON      B.FK = A.PK
        AND B.Title = "Bar"
WHERE   A.Name = "Foo"

に複合キーがある場合(B.FK, B.title)

この場合、結合条件はより視覚的になります。

于 2009-08-05T16:35:51.550 に答える
0

これについては間違っているかもしれませんが、最初のアプローチの方が効率的だと思います。クエリは裏返しに実行されます。そのため、結合を最初に実行すると、(おそらくインデックス化された) PK および FK フィールドで一致する必要があり、Title フィールド (おそらく varchar であり、一致をさらに遅くする) のような無関係なものではないため、より高速に実行されます)。そのため、WHERE 句のフィルタリングに到達するまでには、マッチングを実行するデータが少なくなります。完全な憶測ですが。他の人はなんて言うんだろう。これに関する実行計画を見て損はありません:)

于 2009-08-05T16:33:22.820 に答える