使用T-SQL Merge语句时如何避免插入重复记录
技术问答
266 人阅读
|
0 人回复
|
2023-09-14
|
我试图使用T-SQL的MERGE许多记录插入语句,但当源表中有重复记录时,我的查询无法插入。失败的原因是:3 Y- ?3 s# F4 J! q( [
[ol]基于两列的两列的主键目标表
: x6 U S: D5 P Q. K3 V源表可能包含重复记录,这些记录违反了目标表的主键约束违反主键约束)[/ol]我正在寻找改变我的方法MERGE语句要么忽略源表中的重复记录,要么尝试/捕获INSERT语句捕获可能发生的异常(即所有其他)INSERT语句都将运行,而无论可能会出现一些坏蛋)-也许有更好的方法来解决这个问题?2 r2 R8 s' M8 N+ d; U% ~0 E
这是我想解释的查询示例。在临时表中添加100个示例k记录条,然后尝试将这些记录插入目标表-. X! v, H9 ~6 J0 j" S9 W5 \
编辑% C2 f) C& X8 _9 i5 f$ O- L6 U9 t
在我的原始帖子中,我仅在示例表中包括两个字段,这些字段让SO朋友提供了DISTINCT避免解决方案MERGE句子中有重复。我应该提到,在我的实际问题中,表中有15个字段,而在这15个字段中,两个字段是集群的主键。DISTINCT关键字不起作用,因为我需要选择所有15个字段,而忽略基于其中两个字段的重复项。# {: G/ ]6 h. b; c
我更新了以下查询,以包含更多的字段col4.我需要在合并中包含它col但只需要保证col2和col三是唯一的。) R8 J8 }) a v% N7 j4 L
-- Create the source tableCREATE TABLE #tmp (col2 datetime NOT NULL,col3 int NOT NULL,col4 int)GO-- Add a bunch of test data to the source table-- For testing purposes,allow duplicate records to be added to this tableDECLARE @loopCount int = 100000DECLARE @loopCounter int = 0DECLARE @randDateOffset intDECLARE @col2 datetimeDECLARE @col3 intDECLARE @col4 intWHILE (@loopCounter) 解决你的新规范。只插入最高的。col4值:这次我用group by防止重复行。
, o1 c' V" D6 L, F: g& @: Q! rMERGE INTO dbo.tbl1 AS tbl USING (SELECT col2,col3,max(col4) col4 FROM #tmp group by col2,col3) AS src ON (tbl.col2 = src.col2 AND tbl.col3 = src.col3) WHEN NOT MATCHED THEN INSERT (col2,col3,col4) VALUES (src.col2,src.col3,src.col4);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
|
|
|