首页 > 解决方案 > 从包含所有子集的类别和产品表中复制数据

问题描述

我有一个类别表:tbl_category如下

id是身份密钥

ID 父母身份 姓名
1 1 移动的
2 2 药片
3 1 苹果
4 1 三星
5 3 苹果手机 12
6 4 银河小号

我有一个附加了最新类别的产品表。tbl_productions如下

pid是身份密钥

PID 父母身份 产品名称
1 5 iphone 12 迷你
2 5 iphone 12 专业版
3 6 银河 S 9
4 6 银河 S 10

现在:例如,我想复制移动类别。

此类别包括:iPhone 和三星,每个都有未指定数量的子集。

并且为了让数据清楚,我在他们的名字后面加上了“重复”二字,最后新的数据如下。

新类别数据:

ID 父母身份 姓名
1 0 移动的
2 0 药片
3 1 苹果
4 1 三星
5 3 苹果手机 12
6 4 银河小号
7 0 移动复制
8 7 苹果重复
9 7 三星重复
10 8 iphone 12-重复
11 9 Galaxy S-重复

以及新的生产数据:

PID 父母身份 产品名称
1 5 iphone 12 迷你
2 5 iphone 12 专业版
3 6 银河 S 9
4 6 银河 S 10
5 10 iphone 12 迷你版
6 10 iphone 12 pro 复制版
7 11 星系 S 9 重复
8 11 星系 S 10 重复

(我在类别表中有未指定数量的类别和子类别。我想通过提供 ID 来复制该类别的子类别和产品。例如,我将 ID 4(用于三星)提供给查询并执行手术)

标签: sqlsql-servertsql

解决方案


遵循一个可能对您使用类别表有帮助的示例 - 您可以为第二个表修改它。

我插入了一个额外的行,以检查进一步级别的父子依赖关系。不过,该行暂时被注释掉了。

此外,我将手机和平板电脑的 parentId 更改为 0,因为您的最终结果相应地显示了这些行。

DECLARE @t TABLE(
   id int
  ,parentid int
  ,name varchar(50)
)

INSERT INTO @t VALUES
(1, 0, 'mobile')
,(2, 0, 'tablet')
,(3, 1, 'apple')
,(4, 1, 'samsung')
,(5, 3, 'iphone 12')
,(6, 4, 'Galaxy S')
--,(7,6,'Galaxy S - Proto')

DECLARE @idToCopy int = 1
DECLARE @maxId int = (SELECT MAX(id) FROM @t)

;WITH cte AS(
  SELECT *
    FROM @t
    WHERE id = @idToCopy
  UNION ALL
  SELECT t.id, t.parentid, t.name
    FROM @t t
    INNER JOIN cte c ON t.parentid = c.id
    WHERE t.id != @idToCopy
),
cteNew AS(
  SELECT *, ROW_NUMBER() OVER (ORDER BY parentid, id) AS rn
    FROM cte
)
SELECT c.rn + @maxId AS IdNew
      ,ISNULL(n.rn + @maxId, 0) AS parentidNew
      ,CONCAT(c.name, '-duplicate') AS nameNew
  FROM cteNew c
  LEFT JOIN cteNew n ON n.id = c.parentid
  OPTION (MAXRECURSION 0)

推荐阅读