我花了几天时间解决这个问题。
场景:
在以下领域销售绳索:配件、汽车 > 配件、船舶 > 配件
- 有些绳索只在Marine > Accessories出售
- 有些绳索只在配件中出售(顶部菜单项)
- 部分绳索全部3个出售
- 一般来说,任何项目都需要在任意数量的分支中列出,并且每个分支需要是任意可能的深度。 (此平台只允许 3 个,但为未来而设计)
Collections是某个商店平台允许人们组织物品的方式。
他们的字段是有限的,似乎只有标签字段可用于自定义信息。这是他们系统中离散项的逗号分隔字段。
以下是我的场景的 Collection ~~ 标准定义组合:
- 配件~~标签=“配件”
- 汽车 > 配件 ~~ tags = "汽车 > 配件"
- 海洋 > 配件 ~~ tags = "海洋 > 配件"
我有一个包含 3 个类别的类别表:
Category_ID | Category_Text
1 Accessories
2 Automotive
3 Marine
我卖 2 条绳子:汽车牵引绳和通用尼龙绳
产品表:
Product_ID | Product_Title
1 Automotive Tow-Rope
2 General Purpose Nylon Rope
我的数据提要带有一个类别字段,其中所有分支都以竖线分隔。
..., Title, Category, ...
..., "Automotive Tow-Rope", "Automotive > Accessories", ...
..., "General Purpose Nylon Rope", "Accessories | Automotive > Accessories | Marine > Accessories", ...
我将 Category 字段拆分为像这样 Product_Category_Relationship 数据的关系表:
Product_ID | Branch | Level | Category_ID (Showing text for clarity)
1 1 1 2 (Automotive
1 1 2 1 + Accessories)
2 1 1 1 (Accessories)
2 2 1 2 (Automotive
2 2 2 1 + Accessories)
2 3 1 3 (Marine
2 3 2 1 + Accessories)
这样我可以看到多个分支,每个类别路径的深度。
此时我正在本地使用 SQL Server 来操作文件。我终于让这个查询以非规范化的方式将它们组合在一起。
*** TO DO: JOIN CATEGORY TABLE FOR ACTUAL TEXT VS CAT_ID LIKE EXAMPLE ***
SELECT prod_id, STRING_AGG (branchpath,' | ') AS allpaths
FROM
(SELECT prod_id, branch, STRING_AGG (cat_id,',') WITHIN GROUP (ORDER BY depth) AS branchpath
FROM prod_cat_rel
GROUP BY prod_id, branch) t
GROUP BY prod_id
STRING_AGG 函数是最后的救命稻草。我也在其他平台上看到过关于类似功能的讨论,所以这不是 SQL Server 唯一的解决方案。
我尝试了很多方法将数据整理成合乎逻辑且灵活的排列,并且知道有些人会争论其他层次结构,但这对我有用。
很快,我将完成我的新商店并从我的网站链接它:C'mon 's GO! (cmonsgo.com)
我希望这对其他人有所帮助。
亚当