db2 вставить по выбору значения из другой таблицы - PullRequest
0 голосов
/ 23 ноября 2011

Я пытаюсь вставить в 1 таблицу, где одно из полей - это бег, где нужно увеличивать при вставке, поэтому я создаю SQL вставки, как показано ниже

 INSERT INTO ICGR1100(C_IST, NUM_RIF, C_ORO, NUM_SER, TMSP_CAR, 
                      C_AG_CAR, C_MATR_CAR, C_TP_MAG, DT_RIC, C_FORN, 
                      IMP_PREM, DT_PAGM_PREM, IMP_ACQ, DT_ACQ, IMP_VEND, 
                      DT_VEND, F_GRTS, TMSP_ULT_AGG, C_MATR_ULT_AGG) 
 VALUES('01', (SELECT MAX_NUM_RIF 
                 FROM FINAL TABLE(UPDATE ICGR1005 
                 SET MAX_NUM_RIF = CAST(CAST((CAST(MAX_NUM_RIF AS DECIMAL(16))+1)
                                   AS DECIMAL(16)) AS CHAR(16)) WHERE C_IST='01')), 
                 '005', '0000000000357209', '2011-11-23 17:00:00.000', 
                 '90109', 'Gold', '03', '20111122', '001', 17900, '20111122', 
                 1667500, '20111122', 1795395, '20111122', '0', 
                 '2011-11-23 17:00:00.000', 'Gold')

но получаю ошибку как Ошибка DB2 SQL:

SQLCODE=-20165, SQLSTATE=428FL, SQLERRMC=null, DRIVER=3.50.152

Сообщение:

An SQL data change statement within a FROM  clause is not allowed in the context in which it was specified.. `SQLCODE=-20165, SQLSTATE=428FL, DRIVER=3.50.152` 

Может кто-нибудь посоветовать мне

спасибо заранее

Ответы [ 2 ]

0 голосов
/ 30 ноября 2011

хорошо, простое решение, сначала я запускаю инкремент, а затем вставляю, как показано ниже:

UPDATE ICGR1005 SET MAX_NUM_RIF=CAST(CAST((CAST(MAX_NUM_RIF AS DECIMAL(16))+1) AS DECIMAL(16)) AS CHAR(16)) WHERE C_IST='01';
INSERT INTO ICGR1100(C_IST, NUM_RIF, C_ORO, NUM_SER, TMSP_CAR, C_AG_CAR, C_MATR_CAR, C_TP_MAG, DT_RIC, C_FORN, IMP_PREM, DT_PAGM_PREM, IMP_ACQ, DT_ACQ, IMP_VEND, DT_VEND, F_GRTS, TMSP_ULT_AGG, C_MATR_ULT_AGG) 
VALUES('01', (SELECT MAX_NUM_RIF FROM ICGR1005), '005', '0000000000357209', '2011-11-23 17:00:00.000', '90109', 'Gold', '03', '20111122', '001', 17900, '20111122', 1729000, '20111122', 1869138, '20111122', '0', '2011-11-23 17:00:00.000', 'Gold');
0 голосов
/ 23 ноября 2011

Вы можете попробовать следующее:

INSERT INTO ICGR1100 (
    C_IST, NUM_RIF, C_ORO, NUM_SER, TMSP_CAR, C_AG_CAR, C_MATR_CAR, C_TP_MAG, DT_RIC,     C_FORN, IMP_PREM, DT_PAGM_PREM, MP_ACQ, DT_ACQ, IMP_VEND, DT_VEND, F_GRTS, TMSP_ULT_AGG, C_MATR_ULT_AGG
)
SELECT
    '01', MAX_NUM_RIF, '005', '0000000000357209', '2011-11-23 17:00:00.000', '90109', 'Gold', '03', '20111122', '001', 17900, '20111122', 1667500, '20111122', 1795395, '20111122', '0', '2011-11-23 17:00:00.000', 'Gold'
FROM FINAL TABLE (
    UPDATE ICGR1005
    SET
        MAX_NUM_RIF = CAST(CAST((CAST(MAX_NUM_RIF AS DECIMAL(16))+1) AS DECIMAL(16)) AS CHAR(16))
    WHERE C_IST = '01'
)

Если это не сработает, я бы предложил опубликовать соответствующие операторы CREATE и INSERT, чтобы мы могли выполнить тест локально.

...