将来自多个源表的数据合并到单个目标表中

时间:2012-02-02 22:10:55

标签: sql-server tsql

我正在尝试编写一个存储过程,将一个表的内容转换为另一个表,但我不知道从哪里开始。在我的场景中,我有4个表:[Source],[Type_A],[Type_B]& [目的地]。

[Source]有2列,其值需要转移到[Destination]。 [Source]中的一列是“type”(鉴别器)。

如果“type”为0,那么我需要从[Type_A]&中提取列的子集。添加一些静态值,为[Destination]添加记录。

如果“type”为1,那么我需要从[Type_B]&中提取列的子集。添加一些记录到[目的地],添加了一些不同的静态值。

每次执行此存储过程时将处理可变数量的记录,这些记录将由用户从ASP.NET应用程序调用。

我是SQL中的新手,所以如果解决方案很简单,请原谅我。我知道我可以在代码(C#)中迭代地执行此操作,但我宁愿避免多个DB调用的开销。希望整个事情都包含在交易中。

如果有人能说明我如何能够做到这一点,我将非常感激。

谢谢!

1 个答案:

答案 0 :(得分:2)

假设您在Source,Type_A和Type_B之间有关系:

INSERT INTO Destination
    (Col1, Col2, Col3, Col4, Col5)
    SELECT s.Col1, 
           s.type, 
           /* The next two columns illustrate choosing a  */
           /* subset from either Type_A or Type_B         */
           COALESCE(a.Col3, b.Col3),
           COALESCE(a.Col4, b.Col4),
           /* The next column illustrates choosing a      */
           /* static value based on Source.type           */
           CASE WHEN s.type = 0 THEN 'Static Value 1'
                WHEN s.type = 1 THEN 'Static Value 2'
                ELSE NULL
           END /* CASE */
        FROM Source s
            LEFT JOIN Type_A a
                ON s.Col1 = a.Col1
                    AND s.type = 0
            LEFT JOIN Type_B b 
                ON s.Col1 = b.Col1
                    AND s.type = 1