SQL实现单值标签列关联另一表多列编码值的方法
最高效实现方案
直接对码表Key按餐品分类做4次定向关联即可,这是性能最优、维护成本最低的写法,标准SQL代码如下:
SELECT p.Student_ID, p.Student_Name, meat_item.Item AS Meat, veg_item.Item AS Vegetable, drink_item.Item AS Drink, dessert_item.Item AS Dessert FROM Preferences p -- 匹配肉类标签 LEFT JOIN `Key` meat_item ON meat_item.Item_Type = 'Meat' AND meat_item.Value = p.Meat -- 匹配蔬菜标签 LEFT JOIN `Key` veg_item ON veg_item.Item_Type = 'Vegetable' AND veg_item.Value = p.Vegetable -- 匹配饮品标签 LEFT JOIN `Key` drink_item ON drink_item.Item_Type = 'Drink' AND drink_item.Value = p.Drink -- 匹配甜点标签 LEFT JOIN `Key` dessert_item ON dessert_item.Item_Type = 'Dessert' AND dessert_item.Value = p.Dessert;
执行上述代码即可完全得到你需要的结果表,所有数值都会自动匹配到对应的文本标签。
方案说明
- 性能最优:码表
Key本身数据量极小,4次关联的开销几乎可以忽略。如果给Key表创建(Item_Type, Value, Item)的联合覆盖索引,所有匹配过程都可以直接走索引完成,不需要回表查询,比行转列后关联、子查询匹配、CASE WHEN硬编码等写法的执行效率都高。 - 维护方便:不需要在SQL里硬编码任何码值映射关系,后续
Key表更新餐品名称、新增码值都不需要修改SQL,会自动适配。后续如果新增餐品分类,只需要新增一段对应分类的JOIN逻辑即可。 - 兼容性强:上述写法是ANSI标准SQL,兼容所有主流关系型数据库,不需要使用数据库特有的语法。
避坑提示
不要使用CASE WHEN硬编码值和文本的映射关系(例如CASE WHEN Meat=1 THEN 'Chicken'这类写法),这种写法一旦码表内容调整就必须修改SQL,维护成本极高,且性能没有任何优势。
内容的提问来源于stack exchange,提问作者shaunnol
相关产品推荐
相关产品推荐

