gpt4 book ai didi

sql - TSQL 如果不存在则插入

转载 作者:行者123 更新时间:2023-12-01 13:43:16 25 4
gpt4 key购买 nike

我正在尝试将 1.5M 行从一个数据库复制到另一个数据库。我在 SO 上进行了很多搜索,但无法正常工作。

源表有重复项(使用 Src 表中的 Col1 + Col2),我需要确保没有重复项插入到新的目标表中。这是我的 SQL:

INSERT INTO DestDb.dbo.DestTable ([Col1], [Col2])   
SELECT [Col1], DATEADD(dd, DATEDIFF(dd, 0, [Col2]), 0)
FROM dbo.SrcTable as Table1
WHERE NOT EXISTS (
SELECT 1
FROM DestDb.dbo.DestTable
WHERE DestDb.dbo.DestTable.Col1 = Table1.Col1
AND DATEDIFF(DAY, DestDb.dbo.DestTable.Col2, Table1.Col2) = 0
)

DestDb.dbo.DestTable 有一个复合键 Col1 + Col2

DestDb.dbo.DestTable.Col1 是(PK,nvarchar(128),不为空)

DestDb.dbo.DestTable.Col2 是(PK,datetimeoffset(7),不为空)

dbo.SrcTable.Col1 是 (nvarchar(max), null)

dbo.SrcTable.Col2 是(datetime2(7),不为空)

我收到这个错误:

Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK_DestTable'. Cannot insert duplicate key in object 'dbo.DestTable'. The duplicate key value is (AAAA, 2011-10-13 00:00:00.0000000 +00:00).

我正在使用 datediff,因为目标表只需要记录源列中的日期部分(不需要时间值)。

我真的很困惑,因为使用以下命令直接插入到目标表中可以正常工作:

INSERT INTO [dbo].[DestTable] ([Col1], [Col2])
VALUES ('AAAA', GETDATE())
GO

最佳答案

您需要先消除重复项,例如这里使用 GROUP BY:

with
source as (
SELECT [Col1], DATEADD(dd, DATEDIFF(dd, 0, [Col2]), 0) as Col2
FROM dbo.SrcTable as Table1
),
data as (
select Col1,Col2 from source group by Col1,Col2
)
INSERT INTO DestDb.dbo.DestTable ([Col1], [Col2])
SELECT Col1,Col2 FROM data
;

您可以在第二个 CTE 中使用 SELECT DISTINCT 而不是 GROUP BY,但许多人认为使用 SELECT DISTINCT 是一种反模式。

关于sql - TSQL 如果不存在则插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26453355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com