2010-01-26 51 views
0

其他两个表(一个细节,一个总结),假设我有一个源表是这样的:将数据加载到被相关

Source 
    SourceKey (PK) 
    Data1 
    Data2 
    Amount 

,我来自“源”加载数据分为两相关的表看起来像这样:

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语句来联系他们字段(真实示例具有更复杂的分组)。我不禁感到存在比我创建的更简单的解决方案。

任何解决方案都需要在SQL Server 2000下工作。感谢您的任何想法。

+0

哪个版本的SQL Server以及Data1和Data2中的数据类型? – MartW 2010-01-26 17:22:52

+0

另外,聚合的基础是什么? Summary/Detail表中的SummaryKey与Source表中的任何字段之间没有明显的联系。 – MartW 2010-01-26 17:27:54

+0

@CodeByMoonlight,我已经更新了这个问题,谢谢。 – 2010-01-26 17:59:44

回答

0

使用triggers在第二个表中的摘要表上插入完成时创建该行。它会让你通过一次性修复外键。

0

我在想如何用SCOPE_IDENTITY()@@IDENTITY解决这个问题,尽可能没有触发器,但后来它让我感到震惊 - Summary表的必要性在哪里?

难道它不能被一个视图取代,在这个例子中,它将沿着SELECT Data1, Data2, SUM(amount) FROM Detail GROUP BY Data1, Data2的线? (很明显,在你的确切例子中,细节表没有Data1字段,但我已经使用了诗歌许可证!)

+0

感谢您的建议。不幸的是,在实际的例子中,源表和目标表的模式是固定的。除此之外,为什么索引视图不可行还有其他原因。 – 2010-01-26 17:48:53

+0

并且不要使用@@ idnetity。如果有人添加了一个触发器,它会对具有标识的表执行插入操作,它会给出错误的答案。使用@@标识是等待发生的数据完整性噩梦。 – HLGEM 2010-01-26 18:06:16

0

这样做的目的是什么?如果你只是因为性能的原因而这么做的话,看起来这可能是索引视图的好选择。

+0

感谢您的建议。请看我对doogstar的回复。 – 2010-01-26 17:49:33

2

由于您的设计有许多不足之处,但不可改变。我认为最好的方法是使用游标(男孩我讨厌这个建议)。

将源文件拖放到一个临时表中,该表具有一个SummaryKey的附加列,该列将保持空白并且一个标识关键字称为StagingKey。 使用游标,将记录一次插入摘要。每次插入后,都会拉取scope_identity()的值,并使用刚插入的分段键更新记录,以将该值放入登台表中。 一旦完成所有工作,您应该只需将所有内容插入到一个插入而不是一个游标的细节表中。

在较新版本的SQL Server中,可以使用output子句并为第一个表使用基于集合的插入。

+0

我已经给你一个答案,因为我施加的限制会起作用。和你一样,我对任何涉及游标的解决方案都有强烈的反感,所以我现在要坚持我的'复杂'解决方案。不管怎么说,多谢拉。 – 2010-01-26 18:33:41

+0

如果您必须经常使用大型表格执行此操作,那么将其升级到2008年是一个很好的理由,输出子句使其成为一项简单的任务。 – HLGEM 2010-01-26 18:53:20