我认为这是一个非常常见的问题,可能是重复的,但我不知道如何搜索它。这是我的情景:我有3个表:寄存器,食物和食谱。表格结构简化:
id | item_id |类型(0食品| 1食谱)
(item_id可以是食物ID或食谱ID)
id |名字|重量
id |名字| num_ingredients
我想要的是查询寄存器表并根据类型字段为0或1返回食物或食谱名称(以及每个表中的一些特定字段,如食物中的重量和食谱中的num_ingredients)。
如果表格结构不是最好的,我会感谢帮助我找到最佳解决方案。 非常感谢。
答案 0 :(得分:1)
你可以这样做:
select r.id, r.type, f.name
from
Registers r
inner join Foods f on f.id = r.item_id and r.type = 0
union all
select r.id, r.type, c.name
from
Registers r
inner join Recipes c on c.id = r.item_id and r.type = 1
但你的桌子结构并不理想。首先,由于r.item_id可以包含来自两个表的id,因此无法添加强制引用完整性的约束。你需要一个触发器来检查它,这更复杂,更慢。
相反,我会选择以相反的方式建立关系:
在食物和食谱中添加register_id。然后,您可以像这样编写查询:
select r.id, r.type, f.name
from
Registers r
inner join Foods f on f.register_id = r.id
union all
select r.id, r.type, c.name
from
Registers r
inner join Recipes c on c.register_id = r.id
这几乎是一样的,但你不需要类型,它允许你做出适当的外键约束。
答案 1 :(得分:1)
您需要将两个详细信息表与UNION
合并,然后使用JOIN
和ID
字段将type
与寄存器表合并。
SELECT item_id, name, data
FROM Registers r
JOIN (SELECT 0 type, id, name, weight as data
FROM Foods
UNION
SELECT 1 type, id, name, num_ingredients as data) x
ON r.item_id = x.id AND r.type = x.type
GolezTroi回答UNION
JOIN
之后{{1}}可能会更好,因为它在加入之前不会创建一个大的临时表。