【发布时间】:2009-07-23 15:45:04
【问题描述】:
我正在管理一个数据仓库。我有几个维度表,其中大部分是类型 2,有些是类型 1。
我能够弄清楚如何使用 MERGE 来维护我的类型 1 维度表。
我对如何制作 2 型维度表感到困惑。
如何同时使用 MERGE 命令更新 EndDate 和插入?
【问题讨论】:
标签: sql sql-server tsql sql-server-2008 merge
我正在管理一个数据仓库。我有几个维度表,其中大部分是类型 2,有些是类型 1。
我能够弄清楚如何使用 MERGE 来维护我的类型 1 维度表。
我对如何制作 2 型维度表感到困惑。
如何同时使用 MERGE 命令更新 EndDate 和插入?
【问题讨论】:
标签: sql sql-server tsql sql-server-2008 merge
很遗憾,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 子句,它实际上会重定向这些行,以便您确切地知道它们发生了什么。一个很棒的功能,真的。
【讨论】:
insert into 中的merge 命令。我实际上已经使用过它,但当我第一次回答时完全空白。