SQL键值对查询

问题描述 投票:0回答:1

我有两个表:

产品表

  • ID(PK),描述,类别ID,SegmentID,TypeID,SubTypeID等

属性表

  • ID(PK),ProductID(FK),密钥,值

并且我想在一个联接中查询这两个表,该联接为每种产品返回1行,并且属性表中的所有键/值对记录都在单列中返回,也许用竖线字符(Key1: Value1 | Key2: Value2 | Key3: Value3 | etc.)分隔。每个产品可能有不同数量的键/值对,有些产品只有2-3个,而有些则多达30个。我想弄清楚如何使查询结果看起来像这样(也许选择进入新表):

product.ID,product.Description,[特殊属性列],product.CategoryID,product.SegmentID等

示例结果:

65839, "WonderWidget", "HeightInInches: 26 | WeightInLbs: 5 | Color: Black", "Widgets", "Commerical"  

相反,找出以上述格式设置的查询结果,然后将其推回到原始属性表中,将很有帮助。例如,如果我们将上面的查询输出到修改了[特殊属性列]的表中(值由人工更新/更正了),那么很高兴知道如何使用包含[特殊属性列]的表来更新原始属性表。我认为,为了实现这一点,Attribute.ID字段将需要包含在查询输出中。

最后,我要完成的工作是将具有所有属性数据的产品和属性数据导出到每个产品的1行中,这样人类就可以通过简单的操作对其进行查看/更新/更正。一个Excel文件,然后将其推回SQL。我认为一旦解决了如何获取产品和属性(每个产品一行)的障碍,我就能弄清楚该怎么做。也许正确的答案是将所有属性都旋转到列中,但是恐怕查询范围会非常广且浪费。也欢迎对此提出建议。现在不能更改为文档类型数据库。需要找出在关系SQL中处理此问题的最佳方法。

sql sql-server tsql key-value
1个回答
0
投票

您首先需要对键值对进行分组。这可以使用||这样的concat运算符来实现,您还需要考虑null。在大多数数据库中,与NULL串联的NUll仍然为NULL。

SELECT ProductID, Key || ':' || Value as KeyValue FROM AttributeTable

然后,您需要使用诸如STRING_AGG(假设SQL Server 2017以上)之类的聚合函数对那些分组。其他数据库具有不同的聚合函数Mysql f可以使用GROUP_CONCAT

https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017https://www.geeksforgeeks.org/mysql-group_concat-function/

SELECT ProductID, STRING_AGG( Key || ':' || Value, '|') as Key Value FROM AttributeTable GROUP BY ProductId

如果您可以提供更多信息,我可以提供答案。

© www.soinside.com 2019 - 2024. All rights reserved.