Sql server SSMS/TSQL-为查询中找到的每个记录插入多个记录
我想为符合特定查询条件的每条记录插入多条记录(具体为两条),其中第1列(在创建的两条记录中)具有唯一ID。insert的其余值应从查询中的相应列中提取。在第一次插入中,列2将是列1中的原始值,在第二次插入中,列2将是列2中的原始值 理想情况下,我追求的是:Sql server SSMS/TSQL-为查询中找到的每个记录插入多个记录,sql-server,tsql,ssms-2016,Sql Server,Tsql,Ssms 2016,我想为符合特定查询条件的每条记录插入多条记录(具体为两条),其中第1列(在创建的两条记录中)具有唯一ID。insert的其余值应从查询中的相应列中提取。在第一次插入中,列2将是列1中的原始值,在第二次插入中,列2将是列2中的原始值 理想情况下,我追求的是: FIND RECORDS THAT MEETS CRITERIA FOR EACH RECORD GENERATE GUID INSERT TWO NEW RECORDS WITH GUID AS COLUMN1, AND REMAINING
FIND RECORDS THAT MEETS CRITERIA
FOR EACH RECORD
GENERATE GUID
INSERT TWO NEW RECORDS WITH GUID AS COLUMN1, AND REMAINING COULMNS FROM
CURRENT RECORD FOUND
RECORDS
123 abc 3 4 5
456 def 6 7 8
RECORD 1
123 abc 3 4 5
NEW RECORDS AFTER INSERTS
UID1 123 3 4 5
UID1 abc 3 4 5
ROW 2
456 def 6 7 8
NEW RECORDS AFTER INSERTS
UID2 456 6 7 8
UID2 def 6 7 8
下面的INSERT-SELECT-FROM正好处理了我想要做的事情,但只针对每个找到的记录执行一次插入
INSERT INTO table1
(
Column1,
Column2,
Column3
Column4
Column5
)
SELECT
NEWID(), -- unique ID
Column2, -- or Column1 based on which insert we are doing
Column3, -- always column 3
Column4, --always column 4
Column5 -- always column 5
FROM
table1
WHERE Column1 IS NOT NULL
AND Column1 != Column4
有没有一种简单的方法可以通过TSQL实现这一点?我需要它批量运行,因为可能有数千条记录满足查询条件。这里有一种可能性。首先使用生成第一组行的查询,并将它们插入临时表中
WITH xQ(UUID,Column2,Column3,Column4,Column5) AS
(
SELECT
NEWID(),
Column1,
Column2,
Column3,
Column4,
Column5
FROM
table1
WHERE Column1 IS NOT NULL
AND Column1 != Column4
)
INSERT INTO table1
(
Column1,
Column2,
Column3,
Column4,
Column5
)
SELECT
UUId,
Column1,
Column3,
Column4,
Column5
FROM xQ
UNION
SELECT
UUId,
Column2,
Column3,
Column4,
Column5
FROM xQ
SELECT
NEWID() AS [uid], -- unique ID
column1,
Column2, -- or Column1 based on which insert we are doing
Column3, -- always column 3
Column4, --always column 4
Column5 -- always column 5
INTO #temp
FROM
table1
WHERE Column1 IS NOT NULL
AND Column1 != Column4
现在,使用该临时表,我们可以对同一个表进行联合
,以生成第二组行并将它们插入表1
INSERT INTO table1
SELECT
[uid] AS Column1
, CAST(column1 AS NVARCHAR(3)) AS Column2
, column3
, column4
, column5
FROM #temp
UNION ALL
SELECT
[uid] AS Column1
, column2
, column3
, column4
, column5
FROM #temp
ORDER BY Column1
DROP TABLE #temp
是否希望每对行具有相同的
NEWID
?是,创建的每对记录都具有相同的生成ID。这里的目标是将初始数据拆分为两个记录,并使用生成的ID将这两个记录链接在一起。这似乎为插入的每个记录生成一个UUID。我想我应该澄清一下,这实际上只是插入的每套记录的“唯一性”。两个插入都有一个UUID。否则它就完成了我的目标。你能给我解释一下with xQ语句是什么吗?我进行了快速搜索,但找不到任何相关文档。我在sql server中使用CTE(公共表表达式)为每个按条件返回的记录生成唯一ID,然后使用此结果两次