【发布时间】:2020-01-17 07:13:38
【问题描述】:
我有一个表,其中包含引用其他表中其他行的列或不引用。 例如: - 表 Table_Cart 有一个列 product 作为数字 - 如果产品是水果,那么它指向表 Table_Fruit 中的一行, - 如果产品是蔬菜,那么它指向表 Table_Vegetable 中的一行 - 如果以上都不是,我们可以将值保留为空
我需要生成一个输出,例如说明每种产品是否为“水果”/“蔬菜”/空 所以它应该看起来像
| product | category |
| 1111111 | fruit |
| 2222222 | vegetable|
| 1111113 | fruit |
| 4444444 | |
今天写的sql是
select T1.product, T2.category
from Table_Cart T1 left join
(select product, "fruit" as "category" from Table_fruit
union
select product, "vegetable" as "category" from Table_vegetable
) T2
on T1.product = T2.product
有没有更好的写法?
谢谢
【问题讨论】:
-
我还不明白。购物车表包含一个产品 ID。但是不存在产品表。相反,你有一张水果桌和一张蔬菜桌,也许还有其他桌子。购物车的产品 ID 引用水果表中的一行或蔬菜表中的一行,或者两者都不引用。您会看到它保证同时在水果表和蔬菜表中都不存在 ID。这是正确的吗?
-
这看起来是一个非常不幸的数据模型。是否有一些严重的理由为每种产品类型使用单独的表而不是一个通用产品表?
-
至于您的查询: 1. 引号不正确,正如 Tejash 的回答中已经提到的那样。 2. 当你实际上只想要
UNION ALL时,不要使用UNION。UNION具有查找重复项并将其删除的附加任务。 3. 养成使用助记别名的习惯。T1和T2使查询的可读性降低,例如,c或cart用于table_cart和p或prod用于联合产品表。 -
感谢 cmets 和关于数据模型,我不知道为什么要这样设计