我有一张名为" BBSEC2013_REPORTS"列中的某些值" Q19_MARKETING"一片空白。我想要的是用以前的值" Q1_UNIT_SERIAL_NO"更新那些空值。在主表中。
SQL:
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
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
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
答案 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;