【问题标题】:Updating a Type-2 Dimension with the MERGE command使用 MERGE 命令更新 Type-2 维度
【发布时间】:2009-07-23 15:45:04
【问题描述】:

我正在管理一个数据仓库。我有几个维度表,其中大部分是类型 2,有些是类型 1。

我能够弄清楚如何使用 MERGE 来维护我的类型 1 维度表。

我对如何制作 2 型维度表感到困惑。

如何同时使用 MERGE 命令更新 EndDate 和插入?

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008 merge


    【解决方案1】:

    很遗憾,MERGE 不允许您对一个条件应用多个操作,或者不允许您在一行上多次操作。

    所以,我要做的是使用INSERT INTO 包裹MERGE

    INSERT INTO DimTable
    SELECT ID, Name, StartDate, null as EndDate
    FROM
        (
            MERGE DimTable AS tgt
            USING StageTable AS src
                ON tgt.id = src.id AND tgt.enddate IS NULL
            WHEN MATCHED THEN
                UPDATE SET tgt.enddate = src.startdate
            WHEN NOT MATCHED THEN
                INSERT INTO (ID, Name, StartDate) 
                    VALUES (src.id, src.name, src.startdate)
            OUTPUT $action as Action, src.ID, src.Name, src.StartDate
        ) a
    
    WHERE
        a.Action = 'UPDATE'
    

    其中的关键是 OUTPUT 子句,它实际上会重定向这些行,以便您确切地知道它们发生了什么。一个很棒的功能,真的。

    【讨论】:

    • @Eric:实际上,它会让我在 NO MATCH 上发出多个命令,但不会让我在 MATCH 上发出多个命令。查看这个 BOL 示例 ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_1devconc/html/952595a6-cf1d-4ff5-8927-66f9090cf79d.htm
    • 该链接对我不起作用,但我确实将其更改为使用包裹在insert into 中的merge 命令。我实际上已经使用过它,但当我第一次回答时完全空白。
    • @Eric,老兄......你是炸弹
    • @Eric,我将发布一个后续问题。我将需要表格结构,以便我可以具体谈谈。我将在此处更新该问题的链接。
    猜你喜欢
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多