1

Menuテーブルには次の属性があります。

MEAL_ID
MEAL_NAME
MEAL_TYPE
ITEM1_ID
ITEM2_ID
ITEM3_ID
ITEM4_ID
ITEM5_ID
COST
ACTIVE_INDICATOR    

itemテーブルには次の属性がありました。

ITEM_ID
ITEM_NAME 
ACTIVE_INDICATOR

テーブルitem_id内の各インスタンスの各アイテムの名前を出力しようとしています。menu

select a.MEAL_ID, a.MEAL_NAME, a.MEAL_TYPE, b.ITEM_NAME, b.ITEM_NAME from mdw_meals_menu a, mdw_item_menu b where a.ITEM1_ID = b.ITEM_ID and a.Item2_ID= b.ITEM_ID and a.item3_id= b.ITEM_ID and a.item4_id = b.ITEM_ID and a.item5_ID= b.ITEM_ID;

これは私が使用したコードですが、値を返しません。助けてください

4

4 に答える 4

1

データベースを正規化するには、アイテムを別のテーブルに移動することを検討する必要があります。Meal_Id と Item_Id を含む Meal_Items テーブルを用意することを検討してください。これにより、各食事に関連付けられた 1-n 個のアイテムを持つことができます。

ただし、すべてのアイテム名を含む 1 つの行が必要であると仮定するとJOIN、各アイテムのアイテム テーブルにメニュー テーブルを作成する必要があります。

SELECT m.Meal_Id, a.Meal_Name, a.Meal_Type, 
    i1.Item_Name Item_Name_1,
    i2.Item_Name Item_Name_2,
    i3.Item_Name Item_Name_3,
    i4.Item_Name Item_Name_4,
    i5.Item_Name Item_Name_5
FROM mdw_meals_menu m
   LEFT JOIN mdw_item_menu i1 ON m.Item1_Id = i1.Item_Id
   LEFT JOIN mdw_item_menu i2 ON m.Item2_Id = i2.Item_Id
   LEFT JOIN mdw_item_menu i3 ON m.Item3_Id = i3.Item_Id
   LEFT JOIN mdw_item_menu i4 ON m.Item4_Id = i4.Item_Id
   LEFT JOIN mdw_item_menu i5 ON m.Item5_Id = i5.Item_Id

Item が存在しない場合に備えてa を使用しLEFT JOINましたが、データによっては an を使用できる場合もありINNER JOINます。

于 2013-05-25T12:39:40.737 に答える
0

これを試して...

SELECT  a.MEAL_ID ,
        a.MEAL_NAME ,
        a.MEAL_TYPE ,
        b.ITEM_NAME 
FROM    mdw_meals_menu a ,
        mdw_item_menu b
WHERE   b.ITEM_ID IN ( SELECT   ITEM1_ID
                   FROM     mdw_meals_menu
                   UNION
                   SELECT   ITEM2_ID
                   FROM     mdw_meals_menu
                   UNION
                   SELECT   ITEM3_ID
                   FROM     mdw_meals_menu
                   UNION
                   SELECT   ITEM4_ID
                   FROM     mdw_meals_menu
                   UNION
                   SELECT   ITEM5_ID
                   FROM     mdw_meals_menu )
于 2013-05-25T12:34:57.610 に答える
0

テーブル構造の再設計を検討する必要があると思いますが...

SELECT m.meal_id, m.meal_name, m.meal_type, i1.item_name AS item_name1, i2.item_name AS item_name2
FROM mdw_meals_menu AS m
INNER JOIN mdw_item_menu AS i1 ON i1.item_id=m.item1_id 
INNER JOIN mdw_item_menu AS i2 ON i2.item_id=m.item2_id 
于 2013-05-25T12:39:19.830 に答える
0

5 つの結合を行うことで、これらすべてを 1 つの行に配置できます。

select mm.MEAL_ID, mm.MEAL_NAME, mm.MEAL_TYPE, m1.ITEM_NAME, m2.ITEM_NAME,
       m3.item_name, m4.item_name, m5.item_name
from mdw_meals_menu mm left join
     mdw_item_menu mi1
     on mm.ITEM1_ID = mi1.ITEM_ID left join
     mdw_item_menu mi2
     on mm.ITEM2_ID = mi2.ITEM_ID left join
     mdw_item_menu mi3
     on mm.ITEM3_ID = mi3.ITEM_ID left join
     mdw_item_menu mi4
     on mm.ITEM4_ID = mi4.ITEM_ID left join
     mdw_item_menu mi5
     on mm.ITEM5_ID = mi5.ITEM_ID

このクエリは、結合構文とエイリアスの使用の両方を修正します (エイリアスは、読みやすくするためにテーブルの省略形にする必要があります)。left joinの代わりに使用するのinner joinは、行がドロップアウトしないようにするためです。これは標準的な構文であり、どのデータベースでも機能するはずです。

于 2013-05-25T12:39:21.613 に答える