为具有变量root的记录定义递归查询

时间:2012-11-29 16:14:47

标签: sql tsql sql-server-2005

您正在尝试将数据导入我的数据仓库并简化导入某些数据,我希望在表中创建一个新列,以便在获取新数据时跟踪最新值。

我的表格如下:

CREATE TABLE CustomerFact(
 Id INT IDENTITY PRIMARY KEY
,CustomerId NVARCHAR(20) NOT NULL --Current Id of a Customer
);

--Track changes to CustomerId
CREATE TABLE CustomerHistoryFact(
 Id INT IDENTITY PRIMARY KEY
,CurrentCustomerId NVARCHAR(20) --Most recent Customer Id
,CustomerId NVARCHAR(20) NOT NULL --Customer Id at time of record insert
,PrvsCustomerId NVARCHAR(20) NOT NULL --Customer Id at time of transaction
,PrvsCustomerIdEffectiveDate DATE NOT NULL --Date when PrvsCustomerId was effective
,PrvsCustomerIdObsoleteDate DATE NOT NULL --When the PrvsCustomerId was expired and replaced with a new Customer Id
);

CustomerIdPrvsCustomerIdPrvsCustomerIdEffectiveDatePrvsCustomerIdObsoleteDate都是外部的。我想在插入新记录时分配CurrentCustomerId

这取决于插入新CustomerHistoryFact的时间,检查PrvsCustomerId所有其他记录的CurrentCustomerId。如果匹配,则新记录的CustomerId将成为所有先前记录的CurrentCustomerId,否则将插入记录,CustomerId将成为CurrentCustomerId

1 个答案:

答案 0 :(得分:0)

似乎是一个扭曲的数据库设计。每当CustomerId记录更新时,为什么不能继续在CustomerHistoryFact表中插入CustomerFact?如果按CustomerFact排序的最新CustomerId与Inserted / Deleted表中的customerId不同,您可以在CustomerHistoryFact表上编写用于插入/更新的触发器,并进入CustomerIdEffectiveDate desc表。 。这样,您就可以获得CustomerId的历史记录,从当前的CustomerId开始,再回到过去的时间。

CREATE TABLE CustomerFact(
 Id INT IDENTITY PRIMARY KEY
,CustomerId NVARCHAR(20) NOT NULL --Current Id of a Customer
);

--Track changes to CustomerId
CREATE TABLE CustomerHistoryFact(
 Id INT IDENTITY PRIMARY KEY
,CustomerId NVARCHAR(20) --Most recent Customer Id
,PrevCustomerId NVARCHAR(20) NOT NULL --Customer Id at time of record insert
,UpdatedDate DATETIME NOT NULL --Date when PrvsCustomerId was effective
);

CREATE TRIGGER dbo.CustomerFact_IU
ON dbo.CustomerFact
AFTER INSERT, UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    --
    -- Check if this is an INSERT, UPDATE.
    -- 
    DECLARE @action as char(1);
    DECLARE @oldCustomerId NVARCHAR(20);

    SET @action = 'I'; -- Set Action to Insert by default.
    IF EXISTS(SELECT * FROM DELETED)
    SELECT @oldCustomerId = customerId from DELETED
    BEGIN
        SET @action = 
            CASE
                WHEN EXISTS(SELECT * FROM INSERTED) THEN 'U' -- Set Action to Updated.
                ELSE 'D' -- Set Action to Deleted.       
            END
    END
    ELSE 
        IF NOT EXISTS(SELECT * FROM INSERTED) RETURN; -- Nothing updated or inserted.

    IF @action = 'I' OR @action = 'U'
    BEGIN
         INSERT INTO dbo.CustomerHistoryFact
         SELECT CustomerId, @oldCustomerId, GETUTCDATE() FROM INSERTED 
    END 

    END