1

我需要比较同一张表中的 2 个连续行。如果第二行中缺少数据,我应该使用第一行的数据对其进行更新。

例如:

Row   EmpID  DATE        PosID        EmpStatus  EmpDept  EmpVP
----------------------------------------------------------------------
1     21     2010-12-31  NULL         TC         NULL     40
2     21     2010-01-25  90156840101  NULL       407      NULL
3     21     2003-11-25  NULL         AC         NULL     NULL

第一次迭代:由于Row1 EmpStatus = TC,我想将Row2上的EmpStatus更新为TC(由于其为NULL),并将Row2上的EmpVP更新为40,如下图:

Row   EmpID  DATE        PosID        EmpStatus  EmpDept  EmpVP
----------------------------------------------------------------------
1     21     2010-12-31  NULL         TC          NULL    40
2     21     2010-01-25  90156840101  TC          407     40 
3     21     2003-11-25  NULL         AC          NULL    NULL

第二次迭代:由于 Row3 上的 PositionID 为 NULL,我想用 Row2 的 PositionID 更新 Row3。由于 Row2 现在有 EmpStatus = TC,我想比较 row2 和 row3 数据。由于第 3 行有一个新值,我想保留新值“AC”。但同时我想更新第 3 行的 EmpDept 的值 = 40,因为它是 NULL。期望的结果如下所示:

Row   EmpID  DATE        PosID        EmpStatus  EmpDept  EmpVP
----------------------------------------------------------------------
1     21     2010-12-31  NULL         TC          NULL    40
2     21     2010-01-25  90156840101  TC          407     40 
3     21     2003-11-25  90156840101  AC          407     40

我正在处理历史数据加载,我必须根据日期向后建立记录。

谁能告诉我如何编码?我想知道我们是否可以进行这些更新,最好不使用游标,因为我在这张表中有很多员工。

非常感谢!

4

1 回答 1

1

这是一个迭代过程,不仅取决于访问的每一行,还取决于处理过程中所做的数据更改。我什至无法想象没有游标你会怎么做。

我认为,一旦您决定使用游标,那么只需确定规则(以比您介绍的更通用的方式),然后使用游标实现这些规则。

这似乎是一个一次性的过程,所以我不确定我是否理解您为什么会担心编写一个使用游标处理数据的例程,并在维护期间或仅在缓慢使用期间运行它时期。

下面是一些关于如何解决这个问题的伪代码(您需要从手册中获取实际的语法详细信息,并且您需要确保以正确的顺序和正确的方式应用您的业务规则):

开始

DECLARE @row NUMBER, @posID VARCHAR(20), @empStatus VARCHAR(2), @empDept NUMBER, @empVP NUMBER;
DECLARE @prevPosID VARCHAR(20), @prevEmpStatus VARCHAR(2), @prevEmpDept NUMBER, @prevEmpVP NUMBER;
DECLARE @isFirst NUMBER;
SET @isFirst = 1;

DECLARE  mycurs CURSOR FOR
SELECT   Row, PosID, EmpStatus, EmpDept
FROM     Empl
ORDER BY Date DESC
FOR UPDATE OF Empl;

OPEN mycurs;

FETCH NEXT mycurs INTO @row, @posID, @empStatus, @empDept, @empVP;

WHILE (@@FETCH_STATUS != NOTFOUND)
BEGIN
    IF (@isFirst == 1) THEN
    BEGIN
        @isFirst = 0;
    END
    ELSE
    BEGIN
        IF (@empStatus IS NULL AND @prevEmpStatus IS NOT NULL) THEN
        BEGIN
            SET @empStatus = @prevEmpStatus;
            UPDATE Empl SET EmpStatus = @empStatus WHERE Row = @row;
        END
        IF (@posID IS NULL AND @prevPosID IS NOT NULL) THEN
        BEGIN
            SET @posID = @prevPosID ;
            UPDATE Empl SET PosID = @posID WHERE Row = @row;
        END
        IF (@empDept IS NULL AND @prevEmpDept  IS NOT NULL) THEN
        BEGIN
            SET @empDept = @prevEmpDept;
            UPDATE Empl SET EmpDept= @empDept WHERE Row = @row;
        END
    END

    SET @prevPosID = @posID;
    SET @prevEmpStatus = @empStatus;
    SET @prevEmpDept = @empDept;
    SET @prevEmpVP = @empVP;

    FETCH NEXT mycurs INTO @row, @posID, @empStatus, @empDept, @empVP;
END

DEALLOCATE mycurs;
CLOSE mycurs;

结尾

于 2012-06-07T19:24:50.657 回答