Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 联接字段内容并插入新记录_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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函数需要去掉一个初始逗号
  • 最后,插入结果

这确实可以通过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函数需要去掉一个初始逗号
  • 最后,插入结果

不要获取一个unique
ExtRef
的列表,然后查找字符串,而要执行一个
GroupBy(x=>x.ExtRef)
。不要获取一个unique
ExtRef
的列表,然后查找字符串,而要执行一个
GroupBy(x=>x.ExtRef)