同じテーブルを 2 回結合する: 包括的な調査
このディスカッションでは、開発者が直面する一般的なジレンマ、つまり同じテーブルを効率的に結合するという問題に取り組みます。テーブルを何度も。課題は、両方の結合条件からのデータを含む結果セットを取得することにあります。
次のテーブル構造を考えてみましょう:
*Table1* ID PhoneNumber1 PhoneNumber2 *Table2* PhoneNumber SomeOtherField
目標は、PhoneNumber1、PhoneNumber1、PhoneNumber2 に対応する SomeOtherField を取得することです。 、および PhoneNumber2 に対応する SomeOtherField。
方法 1: 複数のテーブル結合
このアプローチには、テーブルでの結合が 2 回含まれます:
SELECT t1.PhoneNumber1, t1.PhoneNumber2, t2.SomeOtherFieldForPhone1, t3.someOtherFieldForPhone2 FROM Table1 t1 INNER JOIN Table2 t2 ON t2.PhoneNumber = t1.PhoneNumber1 INNER JOIN Table2 t3 ON t3.PhoneNumber = t1.PhoneNumber2
このメソッドは信頼性がありますが、少し冗長に見えます。
メソッド 2: OR -Based Joining
クエリを簡略化するために、開発者は次のように提案しています。 ON 条件で OR 句を使用する:
SELECT ... FROM Table1 INNER JOIN Table2 ON Table1.PhoneNumber1 = Table2.PhoneNumber OR Table1.PhoneNumber2 = Table2.PhoneNumber
ただし、このアプローチは SQL では無効であり、エラーが発生します。
ベスト プラクティス
このシナリオでは、その明確さと信頼性により、方法 1 が推奨されます。電話番号などの自然キーの使用を避けるためにテーブルをリファクタリングすることを強くお勧めします。自然キーは変更されやすいため、メンテナンス プロセスが困難になります。
同じテーブルを複数回結合する場合、可読性と理解を容易にするためにエイリアシングが不可欠です。エイリアスは、テーブルの複数のインスタンスを区別するのに役立ちます。
方法 1 の最適化されたバージョンを次に示します:
SELECT t.PhoneNumber1, t.PhoneNumber2, t1.SomeOtherFieldForPhone1, t2.someOtherFieldForPhone2 FROM Table1 t JOIN Table2 t1 ON t1.PhoneNumber = t.PhoneNumber1 JOIN Table2 t2 ON t2.PhoneNumber = t.PhoneNumber2
以上がSQL で同じテーブルを 2 回効率的に結合して、複数の結合条件からデータを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。