假设我有一个这样的源表:
Source
SourceKey (PK)
Data1
Data2
Amount
我正在将来自'Source'的数据加载到两个相似的表中,如下所示:
Summary
SummaryKey (PK)
Data1
Data2
Amount
Detail
DetailKey (PK)
SummaryKey (FK)
SourceKey (FK)
Data2
Amount
修改
忽略关联“摘要”和“详细信息”的问题,理想的插入语句如下所示:
INSERT INTO Summary (Data1, Data2, Amount)
SELECT Data1, Data2, SUM(Amount) FROM Source GROUP BY Data1, Data2
INSERT INTO Detail (SummaryKey, SourceKey, Data2, Amount)
SELECT ???, SourceKey, Data2, Amount FROM Source
我用一对临时保存表(对应于目标表)以及半复杂的UPDATE语句解决了这个问题,通过匹配分组字段( real 示例有一个更复杂的分组)。我不禁觉得存在比我创造的更简单的解决方案。
任何解决方案都需要在SQL Server 2000下运行。感谢任何想法。
答案 0 :(得分:2)
由于您的设计有很多不足之处,但不可更改。我认为最好的方法是使用光标(男孩,我讨厌建议这个)。
将源拉入一个临时表,该表具有一个额外的SummaryKey列,该列将保持空白,并且标识键称为StagingKey。 使用游标,将记录一次插入摘要中。在每次插入之后,拉取scope_identity()的值,并使用刚刚插入的登台密钥更新记录,以将此值放入登台表。 完成所有操作后,您应该只需要在一个插入而不是光标中插入详细信息表。
在较新版本的SQL Server中,您可以使用output子句并对第一个表使用基于集合的插入。
答案 1 :(得分:0)
使用triggers
在第二个表中的摘要表上完成插入时创建行。它可以让你一键修复外键。
答案 2 :(得分:0)
我正在思考如何使用SCOPE_IDENTITY()
或@@IDENTITY
来解决此问题,尽可能没有触发器,但后来让我感到震惊 - Summary
表的必要性在哪里所有?
它是否可以不被视图替换,在示例中它将沿SELECT Data1, Data2, SUM(amount) FROM Detail GROUP BY Data1, Data2
行?
(显然在您的确切示例中,详细信息表没有Data1字段,但我已经使用了诗歌许可证!)
答案 3 :(得分:0)
这样做的目的是什么?如果你出于性能原因这样做,似乎这可能是索引视图的一个很好的候选者。