【发布时间】:2015-07-23 06:11:45
【问题描述】:
这是一个解释我的意思的示例语句:
DECLARE @sourceTable table(ID int, tmstmp datetime, data varchar(max))
DECLARE @targetTable table(ID int, tmstmp datetime, data varchar(max))
INSERT INTO
@sourceTable
VALUES
(1, '2015-07-23T01:01:00', 'Testdata6')
,(1, '2015-07-23T02:02:00', 'Testdata7')
,(2, '2015-07-23T03:03:00', 'Testdata8')
,(2, '2015-07-23T04:04:00', 'Testdata9')
INSERT INTO
@targetTable
VALUES
(2, '2015-07-23T00:01:00', 'Testdata1')
,(2, '2015-07-23T00:02:00', 'Testdata2')
,(2, '2015-07-23T00:03:00', 'Testdata3')
,(3, '2015-07-23T00:04:00', 'Testdata4')
,(3, '2015-07-23T00:05:00', 'Testdata5')
MERGE INTO
@targetTable T
USING
@sourceTable S
ON
S.ID = T.ID
WHEN MATCHED THEN
DELETE
-- also want to INSERT newer ID 2 source records here after delete
WHEN NOT MATCHED THEN
INSERT (ID, tmstmp, data)
VALUES (S.ID, S.tmstmp, S.data)
;
当我做出选择时...
SELECT
*
FROM
@targetTable
...我得到下表:
ID tmstmp data
3 2015-07-23 00:04:00.000 Testdata4
3 2015-07-23 00:05:00.000 Testdata5
1 2015-07-23 01:01:00.000 Testdata6
1 2015-07-23 02:02:00.000 Testdata7
但我想获得下表:
ID tmstmp data
3 2015-07-23 00:04:00.000 Testdata4
3 2015-07-23 00:05:00.000 Testdata5
1 2015-07-23 01:01:00.000 Testdata6
1 2015-07-23 02:02:00.000 Testdata7
2 2015-07-23 03:03:00.000 Testdata8
2 2015-07-23 04:04:00.000 Testdata9
如何在一个语句中实现这一点,因为我对源表使用了广泛的 CTE。
提前谢谢...
【问题讨论】:
-
如何从 CTE 切换到将结果存储在具有有意义索引的临时表中?你没有选择?
标签: sql-server merge