这个问题一直困扰着我。假设我有一个数据库模式如下:
股票( 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更新Stock表格?也就是说,让股票表以跟踪三个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
股票行,它结合了三个:
10, 5, 2, 7
我尝试过使用INSERT INTO或UPDATE语句,但如果它们是正确的方法,我会感到困惑。我也想知道这是否也是错误的架构设计。
答案 0 :(得分:0)
我假设您已经将book
,food
和drink
条目插入到各自的表中。
在这种情况下,你可以这样做:
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;
如果找不到任何记录或给定null
的可能name
值,则可以使用join
子句。这将仅获取not null
子句中的SELECT
值。像这样:
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;