首页 > 解决方案 > 创建一个加入逗号分隔值的视图

问题描述

我为我的 SQL 作业请求帮助。

我有一张带乐器的桌子:

id  instrument_name         instrument_at_shops
-----------------------------------------------
1   Electric Guitar         1;2;3;4;   
2   Midi Keyboard           1;3;
3   Tom Drum                2; 
4   Electric Guitar         1; 
5   Electric Guitar         0; 

还有一张带商店的桌子:

shop_id  shop_name  shop_address
-----------------------------------------------
1        Shop1      City1 Street 1, building 1                              
2        Shop2      City1 Street 5, building 4                              
3        Shop3      City2 Street 4, building 4                              
4        Shop4      City3 Street 10, building 7                             

在我的乐器表中,我有几个数字代表拥有特定乐器的商店的 ID。

问题是:如何创建一个包含商店名称和该商店中的乐器的视图?

逻辑是这样的:

SELECT shop_name, instrument_name 
FROM Shop 
CROSS JOIN Instrument
WHERE instrumet_at_shops CONTAINS shop_id

但我无法创建适当的查询或视图设计。

先感谢您!

标签: sqlsql-server

解决方案


你真的应该把精力放在修复数据模型上。它坏了,坏了,坏了:

  • 不要在一个字符串中存储多个值。
  • 不要将数字存储为字符串。
  • 应正确声明外键关系。
  • SQL 具有糟糕的字符串处理功能。
  • SQL 有一种很好的方式来存储列表——它被称为表。

如果您遇到了非常非常糟糕的数据模式。. . . 好吧,你应该尝试修复它。但如果没有,您可以使用字符串操作:

select i.*, s.shop_name
from instrument i join
     shops s
     on concat(';', i.instrument_at_shops, ';') like concat('%;', shop_id, ';%');

不幸的是,真的没有办法优化这个查询


推荐阅读