Nano Hash - криптовалюты, майнинг, программирование

Обработка MERGE с дубликатами

Я заказал столы и намереваюсь

oano  code  slno  
0001  swg1   1
0001  swg2   2
0001  swg1   3
0001  swg4   4
0001  swg1   5

намереваться

intend   oano  code  slno
i/1      0001   swg1  1
i/1      0001   swg1  3
i/1      0001   swg2  2  
i/3      0001   swg4  4
i/3      0001   swg1  5

Я хочу обновить серийный номер в таблице намерений на основе таблицы OA, как указано выше. Заявление о слиянии, которое я использовал,

MERGE INTO ITBG_Intend_ITEMS target
USING (select oano, pcode, slno
           from itbg_order_items
           group by oano, pcode,SLNO
      ) source
ON
(target.icode = source.pcode and target.Oano = source.Oano )
WHEN MATCHED THEN UPDATE
    SET target.slno= source.slno

;

показывает ошибку: ORA-30926: невозможно получить стабильный набор строк в исходных таблицах

Пожалуйста помоги

01.04.2019

Ответы:


1

Merge не будет работать, если в исходной таблице есть несколько совпадений для записи в целевой таблице. Вместо этого вы можете использовать update + join:

UPDATE 
(
SELECT ITBG_Intend_ITEMS.slno as target_slno, itbg_order_items.slno as source_slno
 FROM ITBG_Intend_ITEMS
 INNER JOIN itbg_order_items
 ON ITBG_Intend_ITEMS.icode = itbg_order_items.pcode and ITBG_Intend_ITEMS.Oano = itbg_order_items.Oano
) joined
SET joined.target_slno = joined.source_slno
01.04.2019
  • ORA-00933: Команда SQL не завершилась должным образом. Курсор перемещается на From'. Существуют ли изнутри обновления? 01.04.2019
  • @Vishnu Ответ был обновлен, дайте мне знать, есть ли еще какие-либо ошибки. 01.04.2019
  • Отображение ошибки ORA-01779: невозможно изменить столбец, который сопоставляется с таблицей без сохранения ключа. Курсор подходит к join.target_slno 01.04.2019

  • 2

    Проблема в том, что для oano = 0001 и code = swg1 у вас есть три значения slno: 1, 3, 5. Поэтому Oracle не знает, какое из них использовать. Если вам нужно минимальное или максимальное значение, используйте min() или max() в исходной части и удалите slno из предложения group by:

      merge into itbg_intend_items tgt
      using (select oano, pcode, min(slno) slno
               from itbg_order_items
               group by oano, pcode) src
      on (tgt.icode = src.pcode and tgt.oano = src.oano)
      when matched then update set tgt.slno= src.slno
    

    Но если вы хотите присвоить все значения, которые появляются в исходной таблице, вы должны соотнести строки каким-то образом. Это «каким-то образом» можно сделать, например, присвоив номера строкам и таким образом соединив таблицы. Такие подготовленные данные можно использовать в качестве источника в вашем операторе merge:

    merge into itbg_intend_items tgt
    using (
      select rwd, oano, pcode, slno
        from (select oano, pcode, slno, 
                     row_number() over (partition by oano, pcode order by null) rn 
               from itbg_order_items)
        join (select rowid rwd, oano, icode pcode, 
                     row_number() over (partition by oano, icode order by null) rn 
               from itbg_intend_items)
        using (oano, pcode, rn)) src
    on (tgt.icode = src.pcode and tgt.oano = src.oano and tgt.rowid = src.rwd)
    when matched then update set tgt.slno= src.slno
    

    демонстрация dbfiddle

    Конечно, могут быть некоторые проблемы, такие как недостаточное количество значений в источнике для заполнения цели. Или вам может понадобиться определенный порядок (в этом случае измените порядок для row_number()s). Все это можно сделать, но вы должны сказать нам, что вы хотите в таких ситуациях.

    04.04.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..