Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2013, 20:27   #1
Marinkaa
Новичок
Джуниор
 
Регистрация: 12.08.2012
Сообщений: 2
По умолчанию Запрос с Merge

Здравствуйте!

Прошу помочь в определении причины возникновения ошибки при запуске следующего скрипта в Oracle:

merge into a
using b
on (a.id_a= b.id_a and a.value1=5)
when not matched then
insert(id_a, value1, value2) values(b.id_a, 5, b.val);

Появляется ошибка:
ORA-00001: нарушено ограничение уникальности

Ограничение уникальности стоит на комбинацию полей a.id_a и a.value1.

При этом уже имеющиеся значения в таблице A это ограничение не нарушают, и в таблице b также только уникальные значения.

Однако если переписать запрос с помощью not exists, то ошибка исчезает. В чем может быть проблема?
Marinkaa вне форума Ответить с цитированием
Старый 03.08.2013, 01:34   #2
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Удаленно могу предположить, что проблема все же в сопоставлении значений: проход делается по всем значениям b, но вставляются они в a с прошитой константой 5, и если на условие a.id_a= b.id_a есть несколько значений, при вставке второго значения будет нарушение уникальности. Oracle не врет.

Получается, что фактически данный код работает как:
Код:
merge into a using b
on 
  (a.id_a = b.id_a)
where
  a.value1 = 5
when not matched then 
  insert (id_a, value1, value2) values (b.id_a, 5, b.val);
Что вообще требуется сделать по задаче?
Vapaamies вне форума Ответить с цитированием
Старый 03.08.2013, 19:26   #3
Marinkaa
Новичок
Джуниор
 
Регистрация: 12.08.2012
Сообщений: 2
По умолчанию

Добрый вечер!
Мне нужно, чтобы в таблицу А вставлялись значения b.id_a, 5, b.val, если такого сочетания a.id_a= b.id_a and a.value1=5 еще нет в таблице A.
Условие было реализовано с помощью not exists и проблема ушла, однако хотелось бы понять, почему merge заругался.
Запрос запускался в нескольких базах (эти таблицы в них имеют одинаковую структуру) и в одной из баз при запуске появилась ошибка, однако в каждой из баз значение a.id_a= b.id_a уже имелось при вставке в таблице A, но ошибка появилась только однажды.
Marinkaa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Cascade Merge Sort (на Cи) to$in Помощь студентам 0 31.05.2013 12:57
Pекурсивная версия функции merge stasito Помощь студентам 0 13.01.2012 14:54
рекурсивная версия функции merge stasito Помощь студентам 0 12.01.2012 16:26
Подтверждение Merge Chelius Microsoft Office Excel 2 21.06.2010 14:51
Merge menu ds.Dante Общие вопросы .NET 0 17.08.2009 17:51