【问题标题】:Join contents of field and insert new record加入字段内容并插入新记录
【发布时间】:2013-06-25 20:21:31
【问题描述】:

我有两个表结构如下

表格 - 备忘录类型

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):从 Memos 表中填充所有唯一 ExtRef 值的 List;对于每个唯一的ExtRef,获取所有Memo 值的列表;根据需要连接字符串;为每个ExtRef 插入新记录;删除每个ExtRef 的其余记录。问题是这样会导致大量的sql操作。

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

【问题讨论】:

  • 与其获取一些独特的ExtRef 然后查找字符串,不如执行GroupBy(x=&gt;x.ExtRef)

标签: sql sql-server sql-server-2008


【解决方案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 逻辑/描述是从 string concatenate in group by function with other aggregate functions 借用的 - 添加逻辑以插入和删除前导逗号。

  • 我将您的原始查询放在 CTE 中。
  • 然后我交叉应用了一个子查询 外部查询中每个引用的一组以逗号分隔的备忘录。
  • 由于我还选择了备忘录列,因此我还必须按 备忘录专栏。
  • 需要使用 stuff 函数去除初始逗号
  • 最后插入结果。

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多