0

我想这是一个非常常见的问题,可能是重复的,但我不知道如何搜索它。这是我的场景:我有 3 张桌子:寄存器、食物和食谱。表结构简化:

寄存器

编号 | item_id | 类型(0 个食物|1 个食谱)

(item_id 可以是食物 ID 或食谱 ID)

食品

编号| 姓名 | 重量

食谱

编号| 姓名 | num_ingredients

我想要的是查询寄存器表并根据类型字段为 0 或 1 返回食物或食谱名称(以及每个表中的一些特定字段,如食物中的重量和食谱中的 num_ingredients)。

如果表格结构不是最好的,我会感谢帮助我找到最佳解决方案。提前非常感谢。

4

2 回答 2

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 添加到 Foods and Recipes。然后,您可以像这样编写查询:

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

这几乎相同,但您不需要类型,它允许您进行适当的外键约束。

于 2013-07-26T19:51:54.110 回答
1

您需要将两个详细信息表与 a 组合在一起UNION,然后使用和字段将JOIN它们与 Registers 表结合起来。IDtype

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 的答案可能会更好,因为它不会在加入之前创建一个大型临时表UNIONJOIN

于 2013-07-26T19:52:12.643 回答