2017-06-04 52 views
1

我有两个表。使用SQL我想从一个名称池中查找名称。例如:使用两个表中的匹配ID显示名称并从名称池中返回名称值

if foodid1 = foodID return foodName, 
if foodid2 = foodID return foodName, 
if foodid3 = foodid return foodname 

我的表是这样的:

food table    order table 
FoodID FoodName  OrderID FoodID1 FoodID2 FoodID3 
1   chicken   1  1   2   3   
2   fish    2  3   4   5   
3   lamb    3  1   3   2    
4   pie              
5   steak           

我想返回一个值类似的查询:

OrderID FoodID1 FooDID2 FoodID3 
1   chicken fish  lamb 
2   lamb  pie  steak 
3   chicken lamb  fish 

我能得到它,以显示相关的ID和第一组名称,但当我更改代码时出现错误。不确定此查询的正确语法。

SELECT [ORDER TABLE].OID, [ORDER TABLE].FID1, [FOOD TABLE].[Food Name], [ORDER TABLE].FID2 
FROM [FOOD TABLE] INNER JOIN [ORDER TABLE] ON [FOOD TABLE].[FID] = [ORDER TABLE].[FID2]; 

回答

2

你需要加入[order table][food table]三次,每次一个FoodId

SELECT  o.[OrderId], f1.[Food Name], f2.[Food Name], f3.[Food Name] 
FROM  [ORDER TABLE] o 
INNER JOIN [FOOD TABLE] f1 ON o.[FoodId1] = f1.[FoodId] 
INNER JOIN [FOOD TABLE] f2 ON o.[FoodId2] = f2.[FoodId] 
INNER JOIN [FOOD TABLE] f3 ON o.[FoodId3] = f3.[FoodId] 
1

如果您正在使用该数据结构设置,我建议Mureinik的答案,因为它肯定给你你明确要求的结果。不过,我很好奇你为什么用三个不同的food_ID设置你的数据。问问你自己,以下两个订单有什么不同?

1)牛排,鸡,派

2)饼,牛排,鸡

如果答案是否定的,你可以修改你的结构,我建议你离开FoodTable原样,并建立Order表是这样的:

OrderID|FoodID 
1  1 
1  2 
1  3 
2  3 
2  4 
2  5 
3  1 
3  3 
3  2 

那么你的选择查询将是这样的:

SELECT o.OrderID, f.FoodName 
FROM [Order Table] o LEFT JOIN [Food Table] f ON o.FoodID = f.FoodID 
+0

日这个答案的问题是,它排除了值为0的字段。我试图包括where order.fid1 = 0和order.fid1 = food.fid –

+0

你是什么意思为零?你的意思是空吗? – SandPiper

+0

如果单元格为空,则单元格被忽略,如果单元格被忽略,则它将无法显示该行的其余部分的值,因为它没有在所有单元格中的值 –