Ограничение PK нарушено с помощью INSERT / UPDATE - PullRequest
0 голосов
/ 27 августа 2010

У меня есть таблица размеров, подобная этой:

my_Table

pk1  Primary key
pk2  Primary key
pk3  Primary key
col1  
col2  
col3  
...

и с помощью процедуры для заполнения этой таблицы MERGE INTO оператор:

MERGE INTO  my_Table dest
USING 
  ( SELECT <columns>
      FROM <tables>
     WHERE <conditions> ) src
ON 
  (dest.pk1 = src.pk1 AND dest.pk2 = src.pk2 AND pk3 = src.pk3)
WHEN     MATCHED THEN UPDATE SET dest.col1 = src.col1 ,
                                 dest.col2 = src.col2 ,
                                 dest.col3 = src.col3
WHEN NOT MATCHED THEN INSERT (pk1, pk2, pk3, col1, col2, col3) 
                      VALUES (src.pk1, src.pk2, src.pk3, src.col1, src.col2, src.col3);

моя проблема в том, что запрос ' src ' возвращает несколько строк с одинаковыми первичными ключами, но они не являются дублированными строками, например

 | pk1 | pk2 | pk3 |  col1   | col2       | col3  |
 --------------------------------------------------
 | 100 | abc | x99 | 6000,00 | 01/01/2010 | 50,00 | 
 | 100 | abc | x99 | 0,00    | 01/01/2010 | 30,00 |
 | 110 | rty | b50 | 345,00  | 08/10/2009 | 10,00 |
 | 120 | xyz | y91 | 1200,00 | 13/02/2009 | 12,50 |
 | 120 | xyz | y91 | 1200,00 | 13/02/2009 |  0,00 |
 | 120 | xyz | y91 | 1200,00 | 13/02/2009 |  0,00 |
 | 120 | xyz | y91 | 1200,00 | 13/02/2009 |  0,00 |

Итак, когда я вызываю мою процедуру, она возвращает уникальную ошибку нарушения ограничения .

что может быть решением этой проблемы?я не пишу запрос src между прочим ...

если мне нужно изменить src, я должен иметь для pk (100, abc, x99) :

| pk1 | pk2 | pk3 |  col1   | col2       | col3  |   
 --------------------------------------------------    
| 100 | abc | x99 | 6000,00 | 01/01/2010 | 80,00 | 

и для ПК (120, XYZ, Y91) я бы:

| pk1 | pk2 | pk3 |  col1   | col2       | col3  |  
 --------------------------------------------------    
| 120 | xyz | y91 | 1200,00 | 13/02/2009 | 12,50 |

Заранее спасибо за любые предложения.

Ответы [ 2 ]

1 голос
/ 27 августа 2010

Очевидно, что с src нужно что-то сделать, чтобы он возвращал уникальные первичные ключи.Если вас не слишком заботит качество данных в вашей таблице, вы можете использовать агрегирование и изменить его, например, на

 select pk1, pk2, pk3, max(col1), max(col2), sum(col3)
   from ...
   where ...
   group by pk1, pk2, pk3

Но есть вероятность, что вам понадобится более сложная обработка, чтобы понятьвещи.

РЕДАКТИРОВАТЬ: сначала изменили sum на max, чтобы отразить редактирование в вопросе

0 голосов
/ 27 августа 2010

Если вы действительно уверены, что нет конфликта первичных ключей. Пожалуйста, попробуйте проверить, не имеют ли col1, col2 и col3 уникальные ограничения. Возможно, нарушение уникального ограничения не происходит из поля первичного ключа.

Хотите поделиться с нами своим "сообщением об ошибке"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...