3

こんにちは、現在、以下にリストされている 3 つのテーブルがあります。テーブル間に共通キーはありません

表 1->linkage_Table

ID Item         Material       Color
1  keypouch     *              yellow
2  wallet       plastic        *
3  card-holder  leather        gold

表 2->Material_Table

ID Name          
1  plastic
2  wool
3  leather

表 3->Color_Table

ID Color
1  Yellow
2  green
3  orange

次の結果セットを取得したい

Item         Material    Color

keypouch     plastic     yellow
keypouch     wool        yellow
keypouch     leather     yellow
wallet       plastic     yellow
wallet       plastic     green
wallet       plastic     orange
card-holder  leather     gold

テーブルを結合する SQL ステートメントを書きたいと思います。

リンケージ テーブルに * があるということは、Material テーブルまたは Color テーブルからすべての値を取得することを意味します。

私は今、このソリューションを本当に必要としています。これを5時間以上解決しようとしています。助けてくれてありがとう。

4

3 に答える 3

3

1 つの可能なアプローチ:

SELECT l.Item, m.name, c.Color
      FROM linkage_Table AS l
INNER JOIN Material_Table AS m
        ON l.Material = '*'
           OR l.Material = m.name
INNER JOIN Color_Table AS c
        ON l.Color = '*'
           OR l.Color = c.Color

SQL フィドル

説明: クエリは、'material' テーブルと 'color' テーブルが、対応するフィールドに が指定されている場合に完全に (クロス結合) 結合'*'されるか、これらのフィールドが等しくなるように作成する必要があります。そして、それはまさに'ON l.someField = '*' OR l.someField = joined.someField'節を使用して得たものです。

于 2013-10-07T10:28:22.460 に答える
1

例:

CREATE TABLE linkage_table (
  id INT,
  item VARCHAR(40),
  material VARCHAR(40),
  color VARCHAR(40)
);

CREATE TABLE material_table (
  id INT,
  name VARCHAR(40)
);

CREATE TABLE color_table (
  id INT,
  color VARCHAR(40)
);

INSERT INTO linkage_table VALUES (1, 'keypouch', '*', 'yellow');
INSERT INTO linkage_table VALUES (2, 'wallet', 'plastic', '*');
INSERT INTO linkage_table VALUES (3, 'card-holder', 'leather', 'gold');

INSERT INTO material_table VALUES (1, 'plastic');
INSERT INTO material_table VALUES (2, 'wool');
INSERT INTO material_table VALUES (3, 'leather');

INSERT INTO color_table VALUES (1, 'yellow');
INSERT INTO color_table VALUES (2, 'green');
INSERT INTO color_table VALUES (3, 'orange');

SELECT l.item AS Item, m.name AS Material, IFNULL(c.Color, l.color)
  FROM linkage_table l
    LEFT JOIN material_table m ON (l.material = m.name OR l.material = '*')
    LEFT JOIN color_table c ON (l.color = c.color OR l.color = '*')
;

あなたが望んでいたものを正確に返します。サンプル データの「ゴールド」カラーが意図的に欠けているかどうかわからない場合は、

SQLFiddle で確認してください: http://sqlfiddle.com/#!2/d9d3d/4

于 2013-10-07T10:35:42.813 に答える
0

ソーステーブルでの * の使用に基づいて JOIN がターゲットテーブルの複数のエントリを取得しないため、テーブルで * を使用するのではなく、各レコードのデータベースにエントリが必要です。

ID アイテム 素材 色 1 キーポーチ プラスチック イエロー 4 キーポーチ ウール イエロー 5 キーポーチ レザー イエロー

また、色についても同様です。さらに、共通の列に基づいてデータを結合するため、通常は、結合元のソース テーブルの列としてターゲット テーブルの主キーを使用する方が適切 (かつ高速) です。これにより、結合でインデックスを使用して、より高速に実行できるようになります。

于 2013-10-07T10:29:37.463 に答える