合并声明会在这里发挥作用吗?

时间:2012-03-04 19:51:41

标签: sql-server

我很难想到如何处理这个问题:我将一些遗留数据迁移到SQL 2008 SP1 64 BIT。遗留模式使用代理密钥用于事件ID,例如, event1,event2,enventn和出于未知原因,包括一个附加列“valid_event_id”,例如,具有“event_ID ='1'”的行将具有“”valid_event_ID ='25'“。我们没有计划确定有效事件字段的来源或原因,并假设其存在原因。

快进....我们已使用GUID作为event_ID唯一标识符将此表迁移到新架构中,并将原始event_id交叉传输到新GUID中,没有任何问题。

现在我正在努力使用合并声明......甚至不知道从哪里开始,如何将旧的valid_event_id交叉遍历到相应的新GUID。

E.g

第一行旧表

    [OLD_EVENT_ID]'event1',
    [OLD_VALID_EVENT_ID]'event25'
第25行旧表:

[OLD_EVENT_ID]'event25',
[OLD_VALID_EVENT_ID]'NULL'

第一行新表: [new_EVENT_ID]'E42DDB84-1666-E111-A1B2-0023AE8F2836'(匹配event1)

第25行新表: [new_EVENT_ID]'E482CEE5-1E66-E111-A1B2-0023AE8F2836'(匹配事件25)

[event_ID]'EE482CEE5-1E66-E111-A1B2-0023AE8F2836'的行也将计算[valid_event_ID]'E482CEE5-1E66-E111-A1B2-0023AE8F2836'

我希望这是有道理的!

以下是相关表格的片段,其中有几条记录可以举例说明:

8C436BD5-8665-E111-A1B2-0023AE8F2836行的[ATBI_valid_event_id]为Event_009056。目标是使用GUID A9A67562-1E66-E111-A1B2-0023AE8F2836填充相同行的[Valid_Event_ID]列,该GUID对应于具有event_009056的另一行。请注意,行A9A67562-1E66-E111-A1B2-0023AE8F2836没有[ATBI_VALID_EVENT_ID],因此不受此操作的限制,除了提供新GUID以回溯跟踪valid_event_id的

CREATE TABLE #events(
    [Event_ID] [uniqueidentifier] NULL,
    [Valid_Event_ID] [uniqueidentifier] NULL,
    [ATBI_EVENT_ID] [nvarchar](100) NULL,
    [ATBI_VALID_EVENT_ID] [nvarchar](50) NULL
) ON [PRIMARY]
GO
INSERT #events([Event_ID], [Valid_Event_ID], [ATBI_EVENT_ID], [ATBI_VALID_EVENT_ID]) VALUES (N'8c436bd5-8665-e111-a1b2-0023ae8f2836', NULL, N'Event_009055', N'Event_009056')
INSERT #events([Event_ID], [Valid_Event_ID], [ATBI_EVENT_ID], [ATBI_VALID_EVENT_ID]) VALUES (N'4f476bd5-8665-e111-a1b2-0023ae8f2836', NULL, N'Event_009929', N'Event_009928')
INSERT #events([Event_ID], [Valid_Event_ID], [ATBI_EVENT_ID], [ATBI_VALID_EVENT_ID]) VALUES (N'd8486bd5-8665-e111-a1b2-0023ae8f2836', NULL, N'Event_039507', N'Event_039508')
INSERT #events([Event_ID], [Valid_Event_ID], [ATBI_EVENT_ID], [ATBI_VALID_EVENT_ID]) VALUES (N'52fd817c-8d65-e111-a1b2-0023ae8f2836', NULL, N'Event_005734', N'Event_005735')
INSERT #events([Event_ID], [Valid_Event_ID], [ATBI_EVENT_ID], [ATBI_VALID_EVENT_ID]) VALUES (N'05a791f5-1566-e111-a1b2-0023ae8f2836', NULL, N'Event_005735 ', NULL)
INSERT #events([Event_ID], [Valid_Event_ID], [ATBI_EVENT_ID], [ATBI_VALID_EVENT_ID]) VALUES (N'7dea8f4a-1e66-e111-a1b2-0023ae8f2836', NULL, N'Event_009928 ', NULL)
INSERT #events([Event_ID], [Valid_Event_ID], [ATBI_EVENT_ID], [ATBI_VALID_EVENT_ID]) VALUES (N'a9a67562-1e66-e111-a1b2-0023ae8f2836', NULL, N'Event_009056 ', NULL)
INSERT #events([Event_ID], [Valid_Event_ID], [ATBI_EVENT_ID], [ATBI_VALID_EVENT_ID]) VALUES (N'd93afbc1-1e66-e111-a1b2-0023ae8f2836', NULL, N'Event_039508 ', NULL)

1 个答案:

答案 0 :(得分:2)

UPDATE e SET Valid_Event_ID = e2.Event_ID
  FROM #events AS e
  INNER JOIN #events AS e2 
ON e.ATBI_VALID_EVENT_ID = e2.ATBI_EVENT_ID
WHERE e.ATBI_VALID_EVENT_ID IS NOT NULL;

SELECT * FROM #events;

结果:

Event_ID  Valid_Event_ID  ATBI_EVENT_ID  ATBI_VALID_EVENT_ID
8C43....  A9A6....        Event_009055   Event_009056
4F47....  7DEA....        Event_009929   Event_009928
D848....  D93A....        Event_039507   Event_039508
52FD....  05A7....        Event_005734   Event_005735
05A7....  NULL            Event_005735   NULL
7DEA....  NULL            Event_009928   NULL
A9A6....  NULL            Event_009056   NULL
D93A....  NULL            Event_039508   NULL