SQL键值对查询
SQL Key Value Pair Query
我有两个 table:
产品Table
- ID (PK)、描述、CategoryID、SegmentID、TypeID、SubTypeID 等
属性Table
- ID (PK)、ProductID (FK)、键、值
我想在一个连接中查询这两个 table,每个产品 returns 1 行,属性 table 中的所有 Key/Value 对记录=] 在单列中返回,可能由竖线字符 (Key1: Value1 | Key2: Value2 | Key3: Value3 | etc.)
分隔。每个产品可能有不同数量的 key/value 对,有些产品只有 2-3 个,有些产品多达 30 个。我想弄清楚如何让查询结果看起来像这样(也许选进了新的table):
product.ID、product.Description、[特殊属性列]、product.CategoryID、product.SegmentID等
示例结果:
65839, "WonderWidget", "HeightInInches: 26 | WeightInLbs: 5 | Color: Black", "Widgets", "Commerical"
相反,弄清楚如何按照上述格式获取查询结果并将它们推回原始属性 table 会很有帮助。例如,如果我们将上面的查询输出到 table 中,其中 [special attributes column] 被修改(值 updated/corrected 由人类),那么知道如何使用 table 包含 [特殊属性列] 以更新原始属性 table。我认为要实现这一点,Attribute.ID 字段需要包含在查询输出中。
最后,我想要完成的是将产品和属性数据导出到每个产品 1 行的所有属性数据,以便人工审核/updated/corrected在像 Excel 文件这样简单的东西中,然后推回 SQL。我想一旦我克服了弄清楚如何将产品和属性作为每个产品一行的障碍,我就可以弄清楚如何做所有这些。或许正确的答案是将所有属性转换为列,但恐怕查询会非常宽且浪费。对此也持开放态度。更改为文档类型数据库现在不是一个选项;需要找出在关系 SQL 中处理此问题的最佳方法。
您首先需要对键值对进行分组。这可以使用像 || 这样的连接运算符来实现,您还需要考虑空值。 NULL 与 NULL 连接在大多数数据库中仍然是 NULL。
SELECT ProductID, Key || ':' || Value as KeyValue FROM AttributeTable
然后您需要使用像 STRING_AGG 这样的聚合函数对那些进行分组(假设 SQL 服务器高于 2017)。其他数据库有不同的聚合函数 Mysql f ex 使用 GROUP_CONCAT
https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017
https://www.geeksforgeeks.org/mysql-group_concat-function/
SELECT ProductID, STRING_AGG( Key || ':' || Value, '|') as Key Value FROM AttributeTable GROUP BY ProductId
如果你能提供更多信息,我可以扩展答案。
我有两个 table:
产品Table
- ID (PK)、描述、CategoryID、SegmentID、TypeID、SubTypeID 等
属性Table
- ID (PK)、ProductID (FK)、键、值
我想在一个连接中查询这两个 table,每个产品 returns 1 行,属性 table 中的所有 Key/Value 对记录=] 在单列中返回,可能由竖线字符 (Key1: Value1 | Key2: Value2 | Key3: Value3 | etc.)
分隔。每个产品可能有不同数量的 key/value 对,有些产品只有 2-3 个,有些产品多达 30 个。我想弄清楚如何让查询结果看起来像这样(也许选进了新的table):
product.ID、product.Description、[特殊属性列]、product.CategoryID、product.SegmentID等
示例结果:
65839, "WonderWidget", "HeightInInches: 26 | WeightInLbs: 5 | Color: Black", "Widgets", "Commerical"
相反,弄清楚如何按照上述格式获取查询结果并将它们推回原始属性 table 会很有帮助。例如,如果我们将上面的查询输出到 table 中,其中 [special attributes column] 被修改(值 updated/corrected 由人类),那么知道如何使用 table 包含 [特殊属性列] 以更新原始属性 table。我认为要实现这一点,Attribute.ID 字段需要包含在查询输出中。
最后,我想要完成的是将产品和属性数据导出到每个产品 1 行的所有属性数据,以便人工审核/updated/corrected在像 Excel 文件这样简单的东西中,然后推回 SQL。我想一旦我克服了弄清楚如何将产品和属性作为每个产品一行的障碍,我就可以弄清楚如何做所有这些。或许正确的答案是将所有属性转换为列,但恐怕查询会非常宽且浪费。对此也持开放态度。更改为文档类型数据库现在不是一个选项;需要找出在关系 SQL 中处理此问题的最佳方法。
您首先需要对键值对进行分组。这可以使用像 || 这样的连接运算符来实现,您还需要考虑空值。 NULL 与 NULL 连接在大多数数据库中仍然是 NULL。
SELECT ProductID, Key || ':' || Value as KeyValue FROM AttributeTable
然后您需要使用像 STRING_AGG 这样的聚合函数对那些进行分组(假设 SQL 服务器高于 2017)。其他数据库有不同的聚合函数 Mysql f ex 使用 GROUP_CONCAT
https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017 https://www.geeksforgeeks.org/mysql-group_concat-function/
SELECT ProductID, STRING_AGG( Key || ':' || Value, '|') as Key Value FROM AttributeTable GROUP BY ProductId
如果你能提供更多信息,我可以扩展答案。