代码之家  ›  专栏  ›  技术社区  ›  Daniel Pratt

将数据从一个表加载到另两个相关的表(一个细节,一个摘要)

  •  0
  • Daniel Pratt  · 技术社区  · 16 年前

    假设我有一个这样的源表:

    Source
        SourceKey (PK)
        Data1
        Data2
        Amount
    

    我正在将数据从“Source”加载到两个相关的表中,如下所示:

    Summary
        SummaryKey (PK)
        Data1
        Data2
        Amount
    
    Detail
        DetailKey (PK)
        SummaryKey (FK)
        SourceKey (FK)
        Data2
        Amount
    

    编辑

    忽略“Summary”和“Detail”的关联问题,理想的insert语句如下所示:

    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语句“解决”了这个问题,通过匹配分组字段(the

    任何解决方案都需要在SQL Server 2000下运行。谢谢你的建议。

    4 回复  |  直到 16 年前
        1
  •  2
  •   HLGEM    16 年前

    因为你的设计留下了很多需要,但是不变的。我认为最好的方法是使用光标(我讨厌这样建议)。

    将源文件拉到一个临时表中,该表有一个附加的SummaryKey列(该列将保持为空)和一个名为staging key的标识键。 完成所有操作后,应该在一次插入而不是光标中插入到明细表中所需的全部内容。

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

        2
  •  0
  •   Pentium10    16 年前

    使用 triggers 在对摘要表执行插入操作时,在第二个表中创建行。它能让你一下子把外键修好。

        3
  •  0
  •   Doogie    16 年前

    我在想怎么解决这个问题 SCOPE_IDENTITY() @@IDENTITY ,在可能的情况下没有触发器,但我突然想到-在什么情况下 Summary

    不能用一个视图来代替它吗?在这个例子中,这个视图是沿着 SELECT Data1, Data2, SUM(amount) FROM Detail GROUP BY Data1, Data2 ? (显然在您的示例中,detail表没有Data1字段,但我使用了诗意许可证!)

        4
  •  0
  •   Zach Parrish    16 年前