ホームページ >データベース >mysql チュートリアル >直接の外部キー関係を持たずにテーブルを結合するにはどうすればよいですか?

直接の外部キー関係を持たずにテーブルを結合するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-15 18:11:51669ブラウズ

How Can I Join Tables Without a Direct Foreign Key Relationship?

3 番目のテーブルを介して外部キー関係を持つテーブルを結合します

問題の説明

データは多くの場合、外部キーによって関係が定義された複数のテーブルに保存されます。ただし、2 つのテーブルに直接の外部キー関係がない場合でも、3 番目のテーブルを介して結合できる場合があります。この質問では、このような結合を実行して複数のテーブルから特定の情報を抽出する方法を示します。

解決策

テーブル結合には外部キーが必要であるという想定に反して、外部キーは必要ありません。代わりに、テーブルごとに定義された述語に基づいてテーブルを結合できます。

直接の外部キー関係がないテーブルを結合するには、次の手順に従います:

  1. 必要な出力に基づいて、結合する適切なテーブルを決定します。
  2. CROSS JOIN または INNER JOIN 演算子を使用してテーブルを結合します。
  3. WHERE 句を使用して、接続されたデータをフィルタリングするための追加の条件を追加します。

詳しい説明

ステートメントとテーブル:

各テーブルには、テーブルに含まれる行を定義する述語があります。たとえば、Species テーブルには、種名が木の種類と最大高さに対応する行が含まれています。

クエリ述語:

クエリには、FROMWHERE およびその他の句に基づく述語もあります。テーブルのエイリアスを使用すると、列の名前を変更でき、結合条件が容易になります。

結合テーブル:

CROSS JOININNER JOINAND を使用して述語を結合します。 UNIONOR を使用し、EXCEPTAND NOT を使用して述語を結合します。 ON 句と WHERE 句を使用して、追加の結合条件を指定できます。

選択テーブル:

適切なテーブルを選択するには、目的の出力を検討し、必要な列を含むテーブルを特定します。共有する述語に基づいてそれらを結合します。

外部キーとクエリ:

外部キーはクエリの実行には影響しません。整合性制約は強制されますが、接続は制限されません。クエリはテーブル述語に対して評価されます。

クエリの例:

「北極」地域森林の森林名、種名、木材の種類を抽出するには:

<code class="language-sql">SELECT Forest.Fo_name, Species.Sp_name, Species.Sp_woodtype
FROM Forest
INNER JOIN Tree ON Forest.Fo_name = Tree.Tr_forest
INNER JOIN Species ON Tree.Tr_species = Species.Sp_name
WHERE Forest.Fo_loc='ARCTIC'
ORDER BY Forest.Fo_name, Species.Sp_name;</code>

このクエリは、Tr_species 列と Tr_forest 列を介して ForestSpecies、および Tree テーブルを効果的に結合し、Fo_loc 列に基づいて結果をフィルタリングします。出力は森林と種の名前で並べ替えられます。

注: 論理的な正確性を確保し、3 つのテーブルを結合できるようにするために、クエリ例は説明から修正されています。 元の例の ON Tree.Tr_species=Tree.Tr_forest 条件は、テーブル内の 2 つの異なる列を結合しようとしているため、間違っています。 修正されたクエリでは、正しい結合条件が使用されます。

以上が直接の外部キー関係を持たずにテーブルを結合するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。