上面讨论规范化的答案很棒!但是,如果您发现自己处在像我这样的位置上,而又不允许您触摸数据库的架构或结构,该怎么办?例如,DBA是“神”,所有建议的修订版都放在/ dev / null?
在这方面,对于以上提供代码示例的所有用户,我都认为此问题已通过Stack Overflow发布得到了回答。
我正在重新插入INSERT VALUES WHERE NOT EXISTS中的代码,这对我帮助最大,因为我无法更改任何基础数据库表:
INSERT INTO #table1 (Id, guidd, TimeAdded, ExtraData)
SELECT Id, guidd, TimeAdded, ExtraData
FROM #table2
WHERE NOT EXISTS (Select Id, guidd From #table1 WHERE #table1.id = #table2.id)
-----------------------------------
MERGE #table1 as [Target]
USING (select Id, guidd, TimeAdded, ExtraData from #table2) as [Source]
(id, guidd, TimeAdded, ExtraData)
on [Target].id =[Source].id
WHEN NOT MATCHED THEN
INSERT (id, guidd, TimeAdded, ExtraData)
VALUES ([Source].id, [Source].guidd, [Source].TimeAdded, [Source].ExtraData);
------------------------------
INSERT INTO #table1 (id, guidd, TimeAdded, ExtraData)
SELECT id, guidd, TimeAdded, ExtraData from #table2
EXCEPT
SELECT id, guidd, TimeAdded, ExtraData from #table1
------------------------------
INSERT INTO #table1 (id, guidd, TimeAdded, ExtraData)
SELECT #table2.id, #table2.guidd, #table2.TimeAdded, #table2.ExtraData
FROM #table2
LEFT JOIN #table1 on #table1.id = #table2.id
WHERE #table1.id is null
上面的代码使用的字段与您拥有的字段不同,但是您可以使用各种技术来获得基本要点。
请注意,按照堆栈溢出的原始答案,此代码是从这里复制的。
无论如何,我的观点是“最佳实践”通常归结为理论上可以做和不能做的事情。
- 如果您能够规范化并生成索引/键-太好了!
- 如果不是这样,并且您可以使用像我这样的代码黑客,希望以上内容对您有所帮助。
祝好运!
NVARCHAR(64)
列作为主键(和因此而成为集群键)!!首先-这是一个非常宽的密钥-最多128个字节;其次,它的大小可变-再次:不是最佳...这是您可能遇到的最糟糕的选择-您的性能将变得很糟糕,并且表和索引碎片将始终处于99.9%的状态...