【发布时间】:2016-08-01 18:47:40
【问题描述】:
假设我的 SQL Server (2012) 数据库中有下表:
我的表:
Col1: Col2: Col3: Col4: VersionNum:
--------------------------------------------------
Val11 Val21 Val31 Val41 1
Val12 Val22 Val32 Val42 1
Val13 Val23 Val33 Val43 1
...
我有以下数据(比如大约 20000 条记录)想与我当前的表合并:
新数据:
Col1: Col2: Col3: Col4:
------------------------------------
Val11 Val21 Val31 Val41
Val12a Val22 Val32 Val42
因此,第一个值与第一行完全匹配,而第二个值至少有一个元素不同
我希望我的桌子最终看起来像:
我的表:
Col1: Col2: Col3: Col4: VersionNum:
---------------------------------------------------
Val11 Val21 Val31 Val41 1
Val12 Val22 Val32 Val42 1
Val13 Val23 Val33 Val43 1
Val12a Val22 Val32 Val42 2
或者,用文字来表达:
- 如果所有数据元素都匹配,则不要添加新行
- 如果任何一个或多个数据元素不同,则使用更新的版本号添加新行。
我发现this question 似乎处理了类似的此类问题,但仅针对主键差异。我想知道的是,鉴于要用于合并的如此大的数据集,最好/最有效的方法是什么?或者,如果有任何更好的模式(存档表或类似的东西,请分享 - 这对我来说都是全新的,我希望尽可能干净高效地做事情)。
【问题讨论】:
-
我认为你需要澄清这个问题。您的第二个标准说:“如果任何一个或多个数据元素不同,则添加具有更新版本号的新行”,但每个新行都将与几乎每个现有行不同。大概您不想为每个现有行生成 20,000 个新版本?有没有你没有提到的主键?
-
@MikeChristie,这是我的挑战 - 如果任何数据元素不同,他们要求的是连续添加,但不添加任何行是否都匹配......没有主要键。
-
您希望每个新行的版本号为 2 吗?然后下次你这样做时,所有新行都是第 3 版?
-
如果新行可以看作是多个现有行的新版本怎么办?您想为每个符合条件的现有行创建一个新版本吗?还是只为最接近的匹配?
-
@MikeChristie,就是这样 - 事实上,我实际上只是给行加上时间戳,但不想进入那个,因为那里有人会评论时间戳而不是我的实际问题。
标签: sql-server tsql merge