1

我在以下结构中有两个表

表 - 备忘录类型

ID |  MemoTypeID | MemoTypeName
1     1234         A
2     5678         B

表 - 备忘录

ID | MemoTypeID | Memo     | ExtRef
1    1234         TextOne    XYZ
2    5678         TextTwo    XYZ
3    1234         TextThree  TUV

我们希望更新这些表格以反映以下数据

表 - 备忘录类型

ID |  MemoTypeID | MemoTypeName
3     9999         NewCombinedMemo

表 - 备忘录

ID | MemoTypeID | Memo                    | ExtRef
4    9999         <A> TextOne <B> TextTwo   XYZ
5    9999         <A> TextThree             TUV

memos 表有大约 200 万行,大约有 200,000 个唯一值ExtRef

我的想法如下(使用.NET):从表中填充List所有唯一ExtRef值;Memos对于每个唯一的ExtRef获取所有Memo值的列表;根据需要连接字符串;为每个插入新记录ExtRef;删除每个ExtRef. 问题是这样会导致大量的sql操作。

请建议是否有其他有效的策略可以直接在 SQL 中实现这一点。

4

1 回答 1

1

这确实可以直接通过 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 函数删除初始逗号
  • 最后,插入结果。
于 2013-06-25T21:19:40.570 回答