根据具有连接值的列从其他表中获取数据

时间:2019-10-20 16:29:07

标签: sql sql-server

我有两个表:

category中的列:

id    name
1     business
2     sports
...

article中的列:

id   title    categories
1    abc      1|2|3
2    xyz      1|2

我知道应该有一个单独的文章类别表,但是我得到了这个。

是否可以编写返回以下内容的查询:

id    title     category_names
1     xyz       business,sports

我想到了在article-> categories列中拆分字符串,然后在查询中使用 name表中提取category,但是无法弄清楚。

1 个答案:

答案 0 :(得分:1)

您应该修复数据模型。但是,您可以在SQL Server中执行此操作:

select a.*, s.names
from article a cross apply
     (select string_agg(c.name, ',') as names
      from string_split(a.categories, '|') ss join
           category c
           on try_convert(int, ss.value) = c.id
     ) s;

Here是db <>小提琴。

大概,您已经知道此数据模型的缺点:

  • SQL Server具有较差的字符串处理功能。
  • 数字应存储为数字而不是字符串。
  • 外键引用应正确声明。
  • 此类查询无法利用索引和分区。
  • 如果您确实想在一个字段中存储多个值,则SQL Server提供JSON和XML。 字符串不是正确的方法。