如何(快速)整理各种表中的ID?

时间:2009-04-01 17:50:48

标签: sql sql-server normalization etl

我有三个非规范化表,我必须采用面值(数据来自某些外部资源)。这三个表有不同的定义,但它们各自从不同的角度描述相同的对象。

   object1  A  B
   object2  A
   object3     B  C
   object4        C

这些表之间唯一的共同点是它们的主键。我可以使用SELECT UNION SELECT将ID集中在一起,但查询似乎相对较慢,即使每个表的PK字段都已编入索引。我可以创建一个视图来抽象这个查询,vw_object_ids,但它以相同的速度执行。我以为我可以添加索引来实现视图,但在SQL Server 2005中,您无法使用UNION索引视图。

我想要的是让ID的主索引与基础数据同步,这些数据可能会随时更新或删除。我想我可以通过一组疯狂的触发器无限期地完成这个任务,或者只是满足于无索引视图的速度。但我只是想确保我没有错过任何选项,或者这个场景是否有名称或是指示模式。

思想?

2 个答案:

答案 0 :(得分:2)

创建仅包含ID的主表:

CREATE TABLE master (ID INT NOT NULL PRIMARY KEY)

并使所有三个表都使用ON DELETE CASCADE引用该主表。

首次填充表格,发出

INSERT
INTO    master
SELECT  id
FROM    a
UNION
SELECT  id
FROM    b
UNION
SELECT  id
FROM    c

要定期填充表格,请在三个表格中的每一个表格上创建一个触发器。

此触发器应尝试将新ID插入master,并在PRIMARY KEY违规时默默无效。

要查询,请使用:

SELECT  *
FROM    master m
LEFT OUTER JOIN
        a
ON      a.id = m.id
LEFT OUTER JOIN
        b
ON      b.id = m.id
LEFT OUTER JOIN
        c
ON      c.id = m.id

这将使用有效的索引。

要删除,请使用:

DELETE
FROM    master
WHERE   id = @id

这将触发ON DELETE CASCADE并删除所有三个表中的记录(如果有)。

答案 1 :(得分:0)

为什么不直接进行外连接,然后合并组件表中的列?