Sql 联接字段内容并插入新记录
我有两个表,结构如下 表-备忘录类型Sql 联接字段内容并插入新记录,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有两个表,结构如下 表-备忘录类型 ID | MemoTypeID | MemoTypeName 1 1234 A 2 5678 B ID | MemoTypeID | MemoTypeName 3 9999 NewCombinedMemo 表-备忘录 ID | MemoTypeID | Memo | ExtRef 1 1234 TextOne XYZ 2 5678
ID | MemoTypeID | MemoTypeName
1 1234 A
2 5678 B
ID | MemoTypeID | MemoTypeName
3 9999 NewCombinedMemo
表-备忘录
ID | MemoTypeID | Memo | ExtRef
1 1234 TextOne XYZ
2 5678 TextTwo XYZ
3 1234 TextThree TUV
ID | MemoTypeID | Memo | ExtRef
4 9999 <A> TextOne <B> TextTwo XYZ
5 9999 <A> TextThree TUV
我们希望更新这些表格,以反映以下数据
表-备忘录类型
ID | MemoTypeID | MemoTypeName
1 1234 A
2 5678 B
ID | MemoTypeID | MemoTypeName
3 9999 NewCombinedMemo
表-备忘录
ID | MemoTypeID | Memo | ExtRef
1 1234 TextOne XYZ
2 5678 TextTwo XYZ
3 1234 TextThree TUV
ID | MemoTypeID | Memo | ExtRef
4 9999 <A> TextOne <B> TextTwo XYZ
5 9999 <A> TextThree TUV
ID | MemoTypeID | Memo | ExtRef
4 9999文本一个文本两个XYZ
5 9999 TextThree TUV
memos表有大约200万行,其中ExtRef
的唯一值约为200000
我的想法如下(使用.NET):从备忘录
表格中填充所有唯一的ExtRef
值的列表
;对于每个唯一的ExtRef
获取所有Memo
值的列表;根据需要连接字符串;为每个ExtRef
插入新记录;删除每个ExtRef
的其余记录。问题是,这将导致大量sql操作
请建议是否有其他有效的策略可以直接在SQL中实现这一点。这确实可以直接通过SQL实现,以下创建表变量以使用示例数据进行演示/测试,并且不会删除原始数据 使用检查备注类型id的子句可以很容易地删除原始数据,但我希望在我对如此大的表执行手动检查之前,不要这样做
-- setting the scene
DECLARE @MemoType TABLE
(
Id int,
MemoTypeId int,
MemoTypeName varchar(30)
)
DECLARE @Memo TABLE
(
Id int identity(1,1),
MemoTypeId int,
Memo varchar(500),
ExtRef varchar(1000)
)
INSERT INTO @MemoType VALUES (1,1234,'A');
INSERT INTO @MemoType VALUES (2,1234,'B');
INSERT INTO @MemoType VALUES (3,9999,'NewCombinedMemo');
INSERT INTO @Memo VALUES (1234, 'TextOne', 'XYZ');
INSERT INTO @Memo VALUES (5678, 'TextTwo', 'XYZ');
INSERT INTO @Memo VALUES (1234, 'TextThree', 'TUV');
WITH cte(id, memotype, memotext, ref) as (
SELECT Id, MemoTypeId, Memo, ExtRef FROM @Memo
)
INSERT INTO @memo
SELECT 9999, stuff(memos,1,1,''),ref
FROM cte [outer]
CROSS APPLY (
SELECT ',' + memotext
FROM cte [inner]
WHERE [outer].ref = [inner].ref
FOR XML PATH('')
) n(memos)
GROUP BY ref, memos
select * from @memo
CTE逻辑/描述借用自-添加逻辑以插入和删除前导逗号
- 我把你的原始查询放在CTE里了李>
- 然后我交叉应用了一个子查询 外部查询中每个引用的以逗号分隔的备忘录集
- 因为我也选择了备忘录专栏,所以我还必须按 备忘录专栏
- stuff函数需要去掉一个初始逗号
- 最后,插入结果
-- setting the scene
DECLARE @MemoType TABLE
(
Id int,
MemoTypeId int,
MemoTypeName varchar(30)
)
DECLARE @Memo TABLE
(
Id int identity(1,1),
MemoTypeId int,
Memo varchar(500),
ExtRef varchar(1000)
)
INSERT INTO @MemoType VALUES (1,1234,'A');
INSERT INTO @MemoType VALUES (2,1234,'B');
INSERT INTO @MemoType VALUES (3,9999,'NewCombinedMemo');
INSERT INTO @Memo VALUES (1234, 'TextOne', 'XYZ');
INSERT INTO @Memo VALUES (5678, 'TextTwo', 'XYZ');
INSERT INTO @Memo VALUES (1234, 'TextThree', 'TUV');
WITH cte(id, memotype, memotext, ref) as (
SELECT Id, MemoTypeId, Memo, ExtRef FROM @Memo
)
INSERT INTO @memo
SELECT 9999, stuff(memos,1,1,''),ref
FROM cte [outer]
CROSS APPLY (
SELECT ',' + memotext
FROM cte [inner]
WHERE [outer].ref = [inner].ref
FOR XML PATH('')
) n(memos)
GROUP BY ref, memos
select * from @memo
CTE逻辑/描述借用自-添加逻辑以插入和删除前导逗号
- 我把你的原始查询放在CTE里了李>
- 然后我交叉应用了一个子查询 外部查询中每个引用的以逗号分隔的备忘录集
- 因为我也选择了备忘录专栏,所以我还必须按 备忘录专栏
- stuff函数需要去掉一个初始逗号
- 最后,插入结果
ExtRef
的列表,然后查找字符串,而要执行一个GroupBy(x=>x.ExtRef)
。不要获取一个uniqueExtRef
的列表,然后查找字符串,而要执行一个GroupBy(x=>x.ExtRef)
。