8

重複の可能性:
内部結合と Where

今日、デカルト積についてプロジェクト マネージャーと議論しました。彼は、「自然な結合」は「どこから選択」を使用するよりもはるかに優れていると述べています.後者はdbエンジンが内部的にデカルト積を実行する原因となりますが、前者はこれを防ぐ別のアプローチを使用します. 私の知る限り、自然な結合構文は、パフォーマンスや意味の点で「select from where」と何ら変わりはありません。つまり、好みに応じてどちらを使用してもかまいません。

SELECT * FROM table1,table2 WHERE table1.id=table2.id
SELECT * FROM table1 NATURAL JOIN table2

デカルト積を引き起こす最初のクエリについて詳しく説明してください。

4

5 に答える 5

14

正しい方法は、フィルターと結合を分離して明示する必要があります

SELECT * FROM table1 JOIN table2 ON table1.id = table2.id

NATURAL JOINSは簡単で「クリーン」な場合がありますが、まったく予測できない可能性が高くなります...

編集、2012年5月。

複製に対して受け入れられた回答は、実際にはNATURALJOINに回答しません。
これらのリンクでさらに詳しく説明します。

tl; dr

パフォーマンスは問題ではありませんが、クエリは信頼性が高く予測可能である必要がありますが、NATURALJOINは確かにそうではありません。

「JOINintheWHERE」、別名「JOIN」、つまり「デカルト」と呼ばれるものも、これらのリンクに従って悪いものです(同じことがOracleとSQL Serverにも当てはまります)

于 2010-06-17T15:38:49.917 に答える
4

場合によります。

自然結合は、同じ名前の2つのテーブルのすべての列をリンクします。同じ名前のテーブル1と2の2つの列のみがIDである場合、2つのクエリはオプティマイザーによって同じように評価される必要があります。一方、2つのテーブルに同じ名前の列が3つ以上ある(またはまったくない)場合は、まったく異なるクエリが実行されます。

いずれにせよ、デカルト積は、あるテーブルのすべてのレコードを他のテーブルのすべてのレコードと結合するため、ほとんどの場合(常に言いたくなる)、他のタイプの結合よりもパフォーマンスが低下します。

あなたのマネージャーは、大殿筋と尺骨の上端を区別するのにどれほど優れていますか?

于 2010-06-17T15:44:33.960 に答える
3

パフォーマンスに関しては、違いはありません。それは何度も何度も議論されました。「joinsyntaxoraclevs where」をグーグルで検索すると、Alexanderが参照しているこのサイトの記事を含むいくつかの優れた記事が表示されます。

ただし、NATURALJOINの使用には注意してください。これは、createdateやcreateuserなどの一般的な列を取得するため、通常は実際に参加する必要がなく、問題が発生する可能性があります。本番環境ではNATURALJOINを使用しないことを強くお勧めします...INNERJOINを使用して列を指定するだけです。

トムでさえ同意します。

于 2010-06-17T15:37:04.790 に答える
2

最初に指摘することは、データベースオプティマイザが独自の方法で構文を解釈することです。明らかに各製品は異なりますが、テーブルを結合するための最も一般的なメカニズムであるDBMSにペナルティが課せられた場合、私は率直に驚かれることでしょう。

用語に関しては、デカルト積を生成するのはクロス結合です。これは内部結合とは異なり、異なる結果セットを生成します。

最後に、自然な結合は恐ろしいものであり、文字通りバグが発生するのを待っています。それらはすべての正しい考えの人々によって避けられるべきです。

于 2010-06-17T15:38:01.213 に答える
2

どちらの構文も使用しません。あなたのクエリは内部結合を示しています。そのために明示的な構文を使用します。暗黙の結合は絶対に使用しないでください。誤って解釈されたり (偶発的なクロス結合だったのか、それともそうするつもりだったのか?)、偶発的なクロス結合が発生したりする可能性があります。18 年前に置き換えられた C# コードを、より優れた構文で使用しますか? では、なぜ古い SQL コードを使用しているのですか?

暗黙の結合はメンテナンスの問題であるだけでなく、外部結合に暗黙の結合構文を使用しようとすると大きな問題になる可能性があります。これは、一部のデータベースでは正しく機能せず、少なくとも 1 つのデータベース、SQL Server でも非推奨になっているためです。 、 知っている。また、左結合のテーブルにフィルターが必要な場合は、内部結合に変換されるため、暗黙の構文でそれを行うことはできません。

はい、あなたのコードは機能しますが、それは貧弱な手法であり、内部結合を明示的に使用することに慣れる必要があります. 明示的な構文を使用することが第二の性質ではない場合は、より複雑な場合に if を使用する必要があるときに本当に苦労します。

私は 30 年間、データベースのクエリを行ってきましたが、自然な結合を作成する必要があり、それが何であるかを調べなければならなかったことは一度もありませんでした。

于 2010-06-17T17:48:20.073 に答える