繁体   English   中英

使用 SQL String_AGG 作为计算列

[英]Using SQL String_AGG for Computed Column

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

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

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

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

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

Product表中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”,因为人工挑选了这些值并将它们输入到描述字段中。

在我看来,我认为我们应该能够在属性表中添加一列来标识我们想要在描述中使用的属性,按照我们希望它们列出的顺序,并让 SQL 计算或构建描述而不复制数据.

例如:

假设我们有与上面相同的 Attribute 记录,但我们添加了一个 Type 列:

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”开头的Types是描述,后面是数字确定顺序,而“A”Types只是属性,我们不关心排序顺序。

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

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

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

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

在桌子上坚持这一点比它的价值更麻烦。 除非您有特定的性能需要,否则我建议您即时计算它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM