UPSERT в той же таблице - PullRequest
       4

UPSERT в той же таблице

0 голосов
/ 13 сентября 2011

У меня есть следующие две таблицы: ALLOWANCE и RANGES.У ALLOWANCE есть ключевой столбец AllowanceID и, соответствующий каждому AllowanceID, будет ряд записей RANGE.Range имеет первичный ключ RangeID и ссылку на AllowanceID.Помимо них, он имеет следующие столбцы:

RANGESTART
RANGEEND
POUNDS
SUM

Теперь я хочу написать запрос, чтобы соответствовать диапазонам двух AllowanceID.т. е. учитывая SorceAllowanceID и TargetAllowanceID, я хочу сопоставить количество диапазонов, а также значения диапазонов источника для цели.Итак, у меня есть следующий запрос (я использую только один столбец здесь), за которым следует оператор INSERT (здесь не показан),

UPDATE    
( 
   SELECT 
          src.pounds AS src_pounds ,      
          tgt.pounds AS tgt_pounds     
   FROM     
       (
          SELECT  rank() OVER (PARTITION BY PR.ALLOWANCEID ORDER BY PR.RANGESTART)  RN
                  ,PR.* 
         FROM RANGES PR 
         WHERE PR.ALLOWANCEID=sourceallowanceid 
         ORDER BY PR.RANGESTART) src ,
        (SELECT  rank() OVER (PARTITION BY PR.ALLOWANCEID ORDER BY PR.RANGESTART)  PN
           ,PR.* 
         FROM ranges PR 
         WHERE PR.aLLOWANCEID=targetallowanceid 
        ORDER BY PR.RANGESTART) TGT
    WHERE  src.Rn=tgt.PN
)
SET tgt_pounds = src_pounds;

Но это привело к ORA-01779.Затем я попытался с оператором MERGE

MERGE INTO 
  (   
  SELECT  rank() OVER (PARTITION BY PR.ALLOWANCEID ORDER BY PR.RANGESTART)  PN
       ,PR.* 
   FROM     RANGES PR 
   WHERE PR.ALLOWANCEID=targetallowanceid 
   ORDER BY PR.RANGESTART) tgt    
USING (SELECT  rank() OVER (PARTITION BY PR.ALLOWANCEID ORDER BY PR.RANGESTART)  RN
     ,PR.* 
   FROM RANGES PR 
   WHERE PR.ALLOWANCEID=sourceallowanceid 
  ORDER BY PR.RANGESTART) src   
 ON  ( src.RN = tgt.PN )
 WHEN MATCHED
    THEN
       UPDATE
       SET   tgt.pounds = src.pounds
WHEN NOT MATCHED THEN
    --Insert

, который выбросил ORA-00903.

Пожалуйста, объясните мне, как написать запрос для этого.

Благодарю вас всех,

Pradeep

1 Ответ

0 голосов
/ 30 декабря 2011

Я не верю, что вы можете объединиться в подзапрос, поэтому вы получаете ORA-00903: неверное имя таблицы.Однако вы можете изменить этот подзапрос на представление, и оно должно работать.Попробуйте это, например:

CREATE VIEW sub-query subqview as
   SELECT  rank() OVER (PARTITION BY PR.ALLOWANCEID ORDER BY PR.RANGESTART)  PN
       ,PR.* 
   FROM     RANGES PR 
   WHERE PR.ALLOWANCEID=targetallowanceid 
   ORDER BY PR.RANGESTART;

MERGE INTO subqview tgt    
USING (SELECT  rank() OVER (PARTITION BY PR.ALLOWANCEID ORDER BY PR.RANGESTART)  RN
     ,PR.* 
   FROM RANGES PR 
   WHERE PR.ALLOWANCEID=sourceallowanceid 
  ORDER BY PR.RANGESTART) src   
 ON  ( src.RN = tgt.PN )
 WHEN MATCHED
    THEN
       UPDATE
       SET   tgt.pounds = src.pounds
WHEN NOT MATCHED THEN
    --Insert
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...