对计算列使用sql字符串\u agg

ee7vknir  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(366)

我正试图找出解决这种情况并消除数据重复的最佳方法。我有两个表:产品和属性(sql server速成版(14.0.3281.6),ssms v18.4,运行在azure托管的windows server 2019数据中心上)

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

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

产品以一对多的关系与属性相关。一个产品可以有几十个属性。通常,我将使用string\ u agg()将所有属性连接到一个由逗号分隔的列中,这样,对产品和属性的查询将为每个产品返回一行,所有属性都在一个列中。这对于返回产品及其所有属性非常有效。
产品表有一个描述字段,该字段用描述值“手动”填充,这些描述值通常是次(如果不总是)属性。例如:
产品表中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"

假设product表中的description字段中有“widget,blue,150lbs,large”,因为人类选择了这些值并将它们输入description字段。
在我看来,我认为我们应该能够在属性表中添加一列,以确定我们希望在描述中使用的属性,按照我们希望它们列出的顺序,并让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”类型只是属性,我们不关心排序顺序。
我搞不懂的是如何编写一个字符串\u agg,将属性与以d开头的类型连接起来,然后对它们进行排序。我也不确定这是可以持久化到数据库中,还是只能在查询过程中进行计算。此外,还有一些产品比其他产品具有更多的描述属性。
有没有更好的办法解决这个问题?

vyu0f0g1

vyu0f0g11#

如果我理解正确,您可以使用条件逻辑来获取所需的属性:

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

把这一点放在table上是不值得的。我会建议计算它的飞行,除非你有一个特定的性能需要做其他。

相关问题