質問

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"
役に立ちましたか?

解決

これは人によって異なりますが、パターンAの方が優れていると思います。

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

他のヒント

パターンAを好みますが、おそらく違いはありません。ただし、実行プランを効率的に実行するには、実行プランを確認する必要があります。

INNER JOIN OUTER 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

同一です。

Oracle MySQL PostgeSQL 、および 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)に複合キーがある場合。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top