2013-07-19 3 views
0
UPDATE CHILD_COND 
    SET S_TRD= 
     (SELECT S_TRD 
     FROM 
     (SELECT MAX(TV.S_TRD)   AS S_TRD, 
     TV.TRADEID      AS TRADEID, 
     TV.TRD_VER    AS TRD_VER, 
     TV.TIMEST     AS TIMEST, 
     TV.SOURCENAME      AS SOURCENAME, 
     STG_TRADE.SP_COND AS SP_COND 
     FROM MASTER_T TV, 
     T_STG_TRADE_VERSION STG_TRADE 
     WHERE TV.SOURCENAME  = STG_TRADE.SOURCENAME 
     AND TV.TRADEID   = STG_TRADE.TRADEID 
     AND TV.TRD_VER = STG_TRADE.TRD_VER 
     AND TV.TIMEST  = STG_TRADE.TIMEST 
     AND TRADESETID   = '91004' 
     GROUP BY TV.TRADEID, 
     TV.TRD_VER, 
     TV.TIMEST, 
     TV.SOURCENAME, 
     STG_TRADE.SP_COND 
     )TRD WHERE CHILD_COND.SP_COND = TRD.SP_COND AND S_TRD IS NOT NULL 
    ) 

Мне нужно обновить внешний ключ в дочерней таблице на основе первичного ключа из главной таблицы. Но когда в дочерней таблице нет значения, все значения дочернего ключа ребенка обновляются до нуля. S_TRD в настоящее время устанавливается в нуль, когда новые мастер-записи вставляются в MASTER_T, но нет соответствующих дочерних записей в CHILD_CONDПроблема с сложным запросом обновления в Oracle

+0

Почему бы вам не попробовать присоединиться с CHILD_COND в вашем из пункта в самом внутреннем запросе таким образом, вы бы только запустить процесс обновления на мастер-записей с детьми –

+0

Можете ли вы предоставить мне некоторые sample.I не являюсь экспертом в SQL – user2501620

ответ

0

Это MERGE заявление угодит, что только соответствует и не нулевой S_TRD обновляется в child_cond таблице

MERGE INTO CHILD_COND cc 
    USING ( SELECT MAX (TV.S_TRD) AS S_TRD, 
        TV.TRADEID AS TRADEID, 
        TV.TRD_VER AS TRD_VER, 
        TV.TIMEST AS TIMEST, 
        TV.SOURCENAME AS SOURCENAME, 
        STG_TRADE.SP_COND AS SP_COND 
       FROM MASTER_T TV, T_STG_TRADE_VERSION STG_TRADE 
       WHERE  TV.SOURCENAME = STG_TRADE.SOURCENAME 
        AND TV.TRADEID = STG_TRADE.TRADEID 
        AND TV.TRD_VER = STG_TRADE.TRD_VER 
        AND TV.TIMEST = STG_TRADE.TIMEST 
        AND TRADESETID = '91004' 
      GROUP BY TV.TRADEID, 
        TV.TRD_VER, 
        TV.TIMEST, 
        TV.SOURCENAME, 
        STG_TRADE.SP_COND) TRD 
     ON (cc.SP_COND = trd.S_TRD 
     AND trd.S_TRD IS NOT NULL) --remove this filter ,incase you need to copy the null s_trd value to child_cond when matched 
WHEN MATCHED 
THEN 
    UPDATE SET cc.S_TRD = trd.S_TRD 
+0

Но случай слияния часто терпит неудачу в случае появления дубликатов – user2501620

+0

@ user2501620: Итак, как 'UPDATE', вы уверены, что TRD возвращает только одну запись или нуль всегда? , если да, тогда мой код будет работать нормально –

+0

Можете ли вы мне помочь с запросом на обновление – user2501620

0

, если вы не хотите, чтобы обновить s_trd в нуль в случае CHILD_COND.SP_COND не имеет значения, вы можете добавить где условие вам обновить Постулаты:

... 
WHERE SP_COND IS NOT NULL 

UPDATE CHILD_COND 
     SET S_TRD= 
      (SELECT S_TRD 
      FROM 
      (SELECT MAX(TV.S_TRD)   AS S_TRD, 
      TV.TRADEID      AS TRADEID, 
      TV.TRD_VER    AS TRD_VER, 
      TV.TIMEST     AS TIMEST, 
      TV.SOURCENAME      AS SOURCENAME, 
      STG_TRADE.SP_COND AS SP_COND 
      FROM MASTER_T TV, 
      T_STG_TRADE_VERSION STG_TRADE 
      WHERE TV.SOURCENAME  = STG_TRADE.SOURCENAME 
      AND TV.TRADEID   = STG_TRADE.TRADEID 
      AND TV.TRD_VER = STG_TRADE.TRD_VER 
      AND TV.TIMEST  = STG_TRADE.TIMEST 
      AND TRADESETID   = '91004' 
      GROUP BY TV.TRADEID, 
      TV.TRD_VER, 
      TV.TIMEST, 
      TV.SOURCENAME, 
      STG_TRADE.SP_COND 
      )TRD WHERE CHILD_COND.SP_COND = TRD.SP_COND AND S_TRD IS NOT NULL 
     ) 
WHERE SP_COND IS NOT NULL 
Смежные вопросы