2013-11-14 203 views
0

我有3個數據庫表。 第一個包含配料,第二個包含菜餚,第三個配料和菜餚。SQL加入問題

Description

將數據添加到這些表很容易,但我面臨的一個問題,而試圖選擇特定的內容。

將特定菜餚的所有配料重新調配。

SELECT * 
FROM Ingredient As I 
JOIN DishIngredients as DI 
    ON I.ID = DI.IngredientID 
WHERE DI.DishID = 1; 

,但如果我嘗試查詢菜的名稱和說明無論是什麼樣Ø加入我用我總是得到的結果等於使用的成分數量的數。如果我的菜中有4種食材,那麼選擇返回名稱和描述4次,如何修改我選擇的那些值一次?

這是我的查詢結果(和鷹一樣),如果我嘗試選擇名稱和描述。我正在使用MS SQL。

ID   Name  Description               DishID IngredientID 
-- -------------------- -------------------------------------------------------------------- ------ --------- 
1 Spaghetti Carbonara This delcitious pasta is made with fresh Panceta and Single Cream 1  1 
1 Spaghetti Carbonara This delcitious pasta is made with fresh Panceta and Single Cream 1  2 

Kuzgun的查詢對我很好。然而,從你的提示我看到,我真的不需要連接DishIngredient和菜。 當我需要的名稱和Descritpion我可以簡單地去

SELECT * FROM Dish WHERE ID=1; 

Wehn我需要成分的列表,我可以用我上面的查詢。

+1

「如果我嘗試查詢菜名和描述,無論是什麼樣的o加入我使用我總是得到的結果數量等於使用的原料數量。如果這就是你想要的,你不需要加入。 – dasblinkenlight

+0

你能舉一個你想要什麼和你的查詢返回的例子嗎?並且還提供你正在使用的dbms? mysql/sql服務器... – unlimit

回答

1

如果你需要同時顯示盤的細節和成分的細節,你需要加入所有3個表:

SELECT * 
FROM Ingredient As I 
JOIN DishIngredients as DI 
    ON I.ID = DI.IngredientID 
JOIN Dish AS D 
    ON D.ID=DI.DishID 
WHERE DI.DishID = 1; 
0

如果你不關心的成分,你不必使用表DishIngredient 。只要用故事碟。 select * from dish d where d.id=1。 如果你想知道什麼是成分,你使用的sql只是查詢表成分的id。這是沒用的。由於數據庫的設計,有點冗餘是必須的。

select * from dish d join dishingredient di on d.id=di.dishid join ingredient i on  
i.id=di.ingredientid where d.id=1 

當然,你會得到包含菜名和描述的結果數量。 如果你想獲得完整的信息,但至少冗餘,你可以做兩個步驟:

select * from dish d where d.id=1; 
select * from ingredient i join DishIngredient di on i.id=di.ingredientid where  di.dishid=1 

在java中,你可以寫一個類來表示一個菜,來表示它使用的成分列表。

public class Dish { 
    BigDecimal id; 
    String name; 
    String description; 
    List<Ingredient> ingredient; 
} 
class Ingredient{ 
    BigDecimal id; 
    String name; 
    ..... 
}