对计算列使用 SQL String_AGG

Using SQL String_AGG for Computed Column

我正在尝试找出解决这种情况并消除数据重复的最佳方法。我有两个 table:产品和属性。 (SQL Server Express Edition (14.0.3281.6),SSMS v18.4,运行 on Windows Server 2019 Datacenter hosted in Azure)

Product:
SeqNum (PK Int Seed), ProductID (Unique Int), Description

Attribute:
SeqNum (PK Int Seed), ProductSeqNum (FK to Product table), Name, Value

Product 与 Attribute 是一对多的关系。一个产品可以有几十个属性。通常,我会使用 String_Agg() 将所有属性连接到一个用逗号分隔的列中,以便查询产品和属性 returns 每个产品 1 行,所有属性都在一个列中.这对于退回产品及其所有属性非常有用。

产品 table 有一个描述字段,该字段是“手动”填充的,其中描述值通常(如果不总是)也是属性。例如:

产品table中SeqNum为1的产品有以下属性记录:

1, 1, "Name", "Widget"
2, 1, "Color", "Blue"
3, 1, "Size", "Large"
4, 1, "Weight", "150lbs"
5, 1, "Height", "3ft"
6, 1, "Width", "2ft"
7, 1, "Material", "Plastic"
8, 1, "Country of Origin", "USA"
9, 1, "Warranty Length", "2 Years"

假设产品 table 中的描述字段中包含“Widget,Blue,150lbs,Large”,因为人工挑选了这些值并将其输入到描述字段中。

在我看来,我认为我们应该能够在属性 table 中添加一列来标识我们想要在描述中使用的属性,按照我们希望列出的顺序,并且有 SQL 在不复制数据的情况下计算或构建描述。

例如:

假设我们有与上面相同的属性记录,但我们添加了一个类型列:

1, 1, "Name", "Widget", D1
2, 1, "Color", "Blue", D2
3, 1, "Size", "Large", D4
4, 1, "Weight", "150lbs", D3
5, 1, "Height", "3ft", A
6, 1, "Width", "2ft", A
7, 1, "Material", "Plastic", A
8, 1, "Country of Origin", "USA", A
9, 1, "Warranty Length", "2 Years", A

以“D”开头的类型是描述,后面的数字决定顺序,“A”类型只是属性,我们不关心排序顺序。

我想不通的是如何编写 String_Agg 仅将属性与以 D 开头的类型连接起来,然后对它们进行排序。我也不确定这是否可以保存到数据库或仅在查询期间计算。还有一些产品的描述属性比其他产品多的问题。

有没有更好的方法解决这个问题?

如果我没理解错的话,你可以使用条件逻辑来获取你想要的属性:

select ProductSeqNum,
       string_agg(case when type like 'D%' then value end, ',')
from t
group by ProductSeqNum;

用 table 坚持这一点麻烦多于它的价值。我建议您即时计算它,除非您有特定的性能需要否则。