情景-应确定所有有效类别/产品组及其对其中所有产品的有效规格.

  • 产品有不同的规格/功能
  • 产品始终挂在产品组树中最低的层次 struct 级别.
  • 规格可以附加到不同的级别,在这种情况下,可以假设它们只附加到最高(非常一般)和最低级别(非常特殊的尺寸、压力规格等).

由于产品是在最低级别链接的,在我看来,将路径中最低级别的路径中较高级别的所有规范组合在一起将是最简单的.


product_groups
id parent_id
1
2 1
3 2
4 3
5
6 5
7 6
8 7
specification_to_group
id product_group_id 规范ID
1 1 1
2 1 2
3 4 10
4 4 11
5 4 12
6 5 1
7 5 3
8 7 12
result
product_group_id 规范ID
4 1
4 2
4 10
4 11
4 12
8 1
8 3
8 12

一种方法是try 使用帮助表,并且不那么通用.

SELECT
    lst.id AS lst,
    up1.id AS up1,
    up2.id AS up2,
    up3.id AS up3,
    up4.id AS up4
FROM
    product_groups lst 
        LEFT JOIN
    product_groups up1 ON lst.parent_id = up1.id
        LEFT JOIN
    product_groups up2 ON up1.parent_id = up2.id
        LEFT JOIN
    product_groups up3 ON up2.parent_id = up3.id
        LEFT JOIN
    product_groups up4 ON up3.parent_id = up4.id
WHERE
    lst.id NOT IN
    (SELECT DISTINCT parent_id
        FROM product_groups
        WHERE parent_id IS NOT NULL
)
        
SELECT g.lst, s.specification_id
        FROM ht_tree g
               LEFT JOIN specification_to_group s ON g.lst = s.product_group_id
               UNION SELECT g.lst, s.specification_id
        FROM ht_tree g
               LEFT JOIN specification_to_group s ON g.up1 = s.product_group_id
UNION SELECT g.lst, s.specification_id
        FROM ht_tree g
               LEFT JOIN specification_to_group s ON g.up2 = s.product_group_id
UNION SELECT g.lst, s.specification_id
        FROM ht_tree g
               LEFT JOIN specification_to_group s ON g.up3 = s.product_group_id
UNION 
SELECT g.lst, s.specification_id
        FROM ht_tree g
               LEFT JOIN specification_to_group s ON g.up4 = s.product_group_id;
;

由于没有用于创建表的权限,也没有其他选项来持久化已经准备好的数据,我认为应该是CTE.

推荐答案

这是使用递归CTE的classic 机会

WITH recursive  CTE AS(
SELECT `id`, `parent_id`, ROW_NUMBER() OVER (ORDER By id) rn, 1 lvl
FROM  product_groups
WHERE `parent_id` IS NULL
  UNION ALL

  SELECT P1.id, P1.parent_id , M.rn, M.lvl+1 AS LVL
  FROM product_groups P1  
  INNER JOIN CTE M
  ON M.id = P1.parent_id),
  getmax as(
SELECT `id`, MAX(id) OVER(PARTITION BY rn) m FROM CTE
ORDER BY rn)
SELECT sp.id, g.m, sp.`specification_id`
  FROM specification_to_group sp JOIN getmax g ON sp.`product_group_id` = g.id
ORDER By sp.id
<头> <正文>
id m 规范ID
1 4 1
2 4 2
3 4 10
4 4 11
5 4 12
6 8 1
7 8 3
8 8 12

fiddle

Sql相关问答推荐

查询将查找将标记设置为user2的用户

为什么Postgrs Planner会在输出部分中显示我在查询中不使用的列?'""

如何通过比较不同表中相同ID S的值来筛选ID为S的列表?

如何在不更改S代码的情况下,判断存储过程调用了多少次clr函数?

Access VBA SQL命令INSERT FOR MULTIME VALUE

在数据库中搜索列

如何计算一个用户S的日常连胜?

用户购买平台及金额统计

基于是否具有某些数据的关联表覆盖SELECT语句中的列值

将 jsonb 数组中的对象取消嵌套到单独的行中

从输出中删除 jsonb_build_object

错误:postgresql 中缺少表评级的 FROM 子句条目

如何根据 SQL Server 中 1 条语句中 SELECT 的结果进行 INSERT 或 UPDATE

删除重复记录但保留最新的SQL查询

MariaDB非常简单的MATCHAGAINST查询不使用FULLTEXT索引吗?

根据开始时间和结束时间计算has_impact字段

使用日期和间隔作为键加入 Athena 上的表?

忽略与给定列匹配的行的 LAG 函数

SQL:获取连接表的第一个项目

为什么这是 AND,OR with NULL 的真值表?