sql - 从包含所有子集的类别和产品表中复制数据
问题描述
我有一个类别表: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(用于三星)提供给查询并执行手术)
解决方案
遵循一个可能对您使用类别表有帮助的示例 - 您可以为第二个表修改它。
我插入了一个额外的行,以检查进一步级别的父子依赖关系。不过,该行暂时被注释掉了。
此外,我将手机和平板电脑的 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)