2016-03-23 7 views
-1

この問題は、かなりの間私を悩ませています。次のように私は、データベースのスキーマを持っていると言う:他のテーブルのプライマリキーに関連してあるテーブルのIDフィールドを更新する

証券(ID、Book_ID、Meat_ID、Drink_ID)

ブック(Book_ID、BOOK_TITLE、Book_Price、Book_Rating)

食品(Food_ID 、Food_Name、Food_Price)

ドリンク(Drink_ID、Drink_Name、Drink_Price、Drink_Rarity)

Book_ID、Meat_ID、Drink_IDを除くすべてのフィールドが含まれているフラットファイルテーブルとともに

:どのように
FullData(ID、BOOK_TITLE、Book_Price、Book_Rating、Food_Name、Food_Price、Drink_Name、Drink_Price、Drink_Rarity)

うフラットファイルのデータテーブルに関連して、私のブック、フード、ドリンクテーブルのIDを使ってストックテーブルを更新しますか?つまり、株価表を3つのID(3NFにうまくいきます)を記録した形で保持していますか?例えば

: 帳行:

5, "Harry Potter", $10.00, 4 

フード行:

2, "Beef", $5.00 

ドリンク行:

7, "Cola", $3.00, common 

フラットファイル行:

10, "Harry Potter", $10.00, 4, Beef, $5.00, "Cola", $3.00, common 

3を組み合わせたストック行、:

10, 5, 2, 7 

私は、INSERT INTOまたはUPDATEステートメントを使用してみましたが、彼らは正しいアプローチであれば、私は混乱しています。また、これが悪いスキーマ設計であるかどうかも疑問です。

+0

b/w本、食べ物、飲み物は何ですか? –

+0

これらはすべて架空の店で在庫の一部です。多分、これは最良の例ではなかったでしょう。 – SmashingGood

答えて

0

すでにbookfooddrinkのエントリをそれぞれのテーブルに挿入していることを前提としています。このような場合には

、あなたはこれを行うことができます。

INSERT INTO stock (book_id, meat_id, drink_id) 
SELECT (select b.id from book b where b.name = ff.book_title), 
     (select f.id from food f where f.name = ff.food_name), 
     (select d.id from drink d where d.name == ff.drink_name) 
    FROM <flat_file_table> ff; 

全く発見されるレコードまたは特定のnameのための可能なnull値がない場合は、join句を使用することができます。 SELECT句にはnot nullの値のみが取り出されます。このように:

INSERT INTO stock (book_id, meat_id, drink_id) 
SELECT b.id, f.id, d.id 
    FROM <flat_file_table> ff 
    JOIN book b ON ff.book_title = b.name 
    JOIN food f ON ff.food_name = f.name 
    JOIN drink d ON ff.drink_name = d.name; 
+0

その構文は正しいですか?オペランドに1つの列しか含めるべきではないというエラーが表示されます。 – SmashingGood

+0

私はそれらを分けてみました: 'INSERT INTO stock(在庫を入れてください(book_id)b.book_title = f.book_titleからb.idを選択してb.book_title = f.book_title)を処理しましたが、在庫のすべてのbook_id値をnullにしました。 – SmashingGood

+0

@SmashingGood:私は追加の ')'を追加しました。今編集しました。 –

関連する問題