1

同じテーブル内の 2 つの連続した行を比較する必要があります。2 行目のデータが欠落している場合は、1 行目のデータで更新する必要があります。

例:

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

最初の反復: 行 1 の EmpStatus = TC であるため、以下に示すように、行 2 の EmpStatus を TC (NULL であるため) に更新し、行 2 の 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

2 回目の反復: Row3 の PositionID が NULL であるため、Row3 を Row2 の PositionID で更新したいと考えています。Row2 の EmpStatus = TC になったので、row2 と row3 のデータを比較したいと思います。Row3 には新しい値があるので、新しい値「AC」を保持したいと思います。しかし同時に、Row3 = 40 の EmpDept の値が 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

これは、アクセスした各行だけでなく、処理中に行われたデータ変更にも依存する反復プロセスです。カーソルなしでそれを行う方法を想像することさえできません。

カーソルを使用することに決めたら、ルールを決定し(提示したよりも一般的な方法で)、カーソルを使用してそれらのルールを実装するだけの問題だと思います。

これは 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 に答える