如何通过同一个表中的上一个记录更新空值?

时间:2014-12-04 06:35:57

标签: sql oracle oracle11g oracle10g

我有一张名为" BBSEC2013_REPORTS"列中的某些值" Q19_MARKETING"一片空白。我想要的是用以前的值" Q1_UNIT_SERIAL_NO"更新那些空值。在主表中。

SQL:

找到NULLS

SELECT R.BOOK_ID, R.QUESTIONNARIE_ID, R.Q1_UNIT_SERIAL_NO ,     R.Q19_MARKETING
FROM  BBSEC2013_REPORTS  R
WHERE ( R.Q19_MARKETING = 9 OR R.Q19_MARKETING  is null )
AND F_TO_NUMBER(SUBSTR(R.Q6_IND_CODE_CLASS_CODE,1,2)) BETWEEN 10 AND 33
ORDER BY R.BOOK_ID, R.QUESTIONNARIE_ID, R.Q1_UNIT_SERIAL_NO

选择PREVIOUS UNIT的值

SELECT R.Q19_MARKETING FROM BBSEC2013_REPORTS R
WHERE R.BOOK_ID = * BOOK_ID OF SQL-1 
AND   R.Q1_UNIT_SERIAL_NO = * DECREMENT VALUE OF "Q1_UNIT_SERIAL_NO" OF SQL-1 
ORDER R.BY BOOK_ID, R.QUESTIONNARIE_ID,R.Q1_UNIT_SERIAL_NO

UPDATING

UPDATE BBSEC2013_REPORTS 
SET Q19_MARKETING= Q19_MARKETING OF SQL-2
WHERE BOOK_ID = * BOOK_ID OF SQL-1
AND Q1_UNIT_SERIAL_NO = * Q1_UNIT_SERIAL_NO OF SQL-1

enter image description here

2 个答案:

答案 0 :(得分:1)

您应该能够将提供的DML语句组合成一个例如

UPDATE bbsec2013_reports r
SET    r.q19_marketing =
   (SELECT r1.q19_marketing
    FROM   bbsec2013_reports r1
    WHERE  r1.book_id = r.book_id
    AND    r1.q1_unit_serial_no = to_char(to_number(r.q1_unit_serial_no)-1, 'FM000'))
WHERE  (  r.q19_marketing = 9
       OR r.q19_marketing IS NULL)
AND    f_to_number(substr(r.q6_ind_code_class_code, 1, 2)) BETWEEN 10 AND 33

编辑)或者如果减少则不一定是1:

UPDATE bbsec2013_reports r
SET    r.q19_marketing =
   (SELECT max(r1.q19_marketing) KEEP (DENSE_RANK LAST ORDER BY r1.q1_unit_serial_no)
    FROM   bbsec2013_reports r1
    WHERE  r1.book_id = r.book_id
    AND    r1.q1_unit_serial_no < r.q1_unit_serial_no)
WHERE  (  r.q19_marketing = 9
       OR r.q19_marketing IS NULL)
AND    f_to_number(substr(r.q6_ind_code_class_code, 1, 2)) BETWEEN 10 AND 33

现在,如果需要,您可以在子查询中添加其他WHERE子句,例如: r1.q19_marketing <> 9 AND r1.q19_marketing IS NOT NULL以找到具有有效q19_marketing值的上一条记录。

答案 1 :(得分:0)

(代表OP发布)。

我得到了这个解决方案:

DECLARE
V_MARKETING NUMBER;

BEGIN

FOR X IN (SELECT QUESTIONNARIE_ID FROM BBSEC2013_REPORTS 
        WHERE Q6_IND_CODE_CLASS_CODE < 3400 
        AND (Q19_MARKETING IS NULL OR Q19_MARKETING=9) 
        )

LOOP
    SELECT Q19_MARKETING
    INTO V_MARKETING
    FROM BBSEC2013_REPORTS 
    WHERE QUESTIONNARIE_ID=(SELECT MAX(QUESTIONNARIE_ID) 
                            FROM BBSEC2013_REPORTS 
                            WHERE QUESTIONNARIE_ID < X.QUESTIONNARIE_ID
                            AND Q6_IND_CODE_CLASS_CODE<3400
                            AND (Q19_MARKETING IS NOT NULL OR Q19_MARKETING!=9)
                            );

    IF V_MARKETING > 0 THEN

        UPDATE BBSEC2013_REPORTS 
        SET Q19_MARKETING = V_MARKETING
        WHERE QUESTIONNARIE_ID = X.QUESTIONNARIE_ID;

    END IF;

    COMMIT;

END LOOP; 

END;